2016-03-01 46 views
0

我有一個比較複雜的webflow設置,允許在流程中向前和向後導航。這個webflow有一個我們稱之爲flowModel的後臺對象。對Spring Webflow中模型屬性字段變化的反應

因此,視圖狀態是這個樣子:

<view-state id="beginPage" model="flowModel" view="begin"> 
    // contents 
</view-state> 

<view-state id="multipleChoicePage1" model="flowModel" view="choicePage1"> 
    // contents 
</view-state> 

<view-state id="multipleChoicePage2" model="flowModel" view="choicePage2"> 
    // contents 
</view-state> 

<view-state id="summaryPage" model="flowModel" view="summaryPage"> 
    // contents 
</view-state> 

當我選擇從選擇頁面的一個東西,查看它的摘要,然後回去在流動,使不同,會出現問題選擇。摘要頁面仍將顯示從原始路徑計算出的值。

有沒有在webflow中確定模型中的字段值是否已更改的方法?如果是這種情況,我可以手動更改<on-exit><action-state>中的「計算」值。否則,我唯一的想法是在<view-state>內的<on-start><on-render>階段附加一個PropertyChangeListener。

任何想法/建議,將不勝感激。

更新

我想通了,通過<on-exit>方法被打的時候,新的價值觀已經綁定到模型。所以,我最後做的:

<view-state id="beginPage"> 
<on-render> 
    <evaluate expression="flowController.enterBeginPage(flowRequestContext)" /> 
</on-render> 
<!-- Transitions --> 
<on-exit> 
    <evaluate expression="flowController.exitBeginPage(flowRequestContext)" /> 
</on-exit> 

流量控制器內部,在渲染和退出方法是這樣的:

public void onRenderBeginPage(RequestContext requestContext) { 
    MyForm form = requestContext.getFlowScope().get("flowModel",MyForm.class); 
    requestContext.getFlowScope().put("originalFlowModel", form); 
} 

public void onExitBeginPage(RequestContext requestContext) { 
     MyForm form = requestContext.getFlowScope().get("flowModel",MyForm.class); 
    MyForm originalForm = requestContext.getFlowScope().get("originalFlowModel", MyForm.class); 
    requestContext.getFlowScope().remove("originalFlowModel"); 
    if (!form.getOption().equals(originalForm.getOption()) { 
     // do something 
    } 
} 

它似乎工作不夠好,即使它是一個一點kludge。

回答

1

嗯,我想你可以使用多個flowModel對象也許? 我不是很喜歡它,但也許它可以工作

<var name="flowModel" type="FlowModel"/> 
<var name="flowModelChoice1" type="FlowModel"/> 
<var name="flowModelChoice2" type="FlowModel"/> 
<var name="flowModelChoice3" type="FlowModel"/> 

<view-state id="beginPage" model="flowModel" view="begin"> 
    // contents 
</view-state> 

<view-state id="multipleChoicePage1" model="flowModel1" view="choicePage1"> 
    <on-entry> 
     // copy flowModel into flowModel1 
    </on-entry> 
    <transition on="event" to="summaryPage"> 
     // copy flowModel1 into flowModel3 
    </transition> 
</view-state> 

<view-state id="multipleChoicePage2" model="flowModel2" view="choicePage2"> 
    <on-entry> 
     // copy flowModel into flowModel2 
    </on-entry> 
    <transition on="event" to="summaryPage"> 
     // copy flowModel2 into flowModel3 
    </transition> 
</view-state> 

<view-state id="summaryPage" model="flowModel3" view="summaryPage"> 
    // contents 
</view-state> 
+0

以上是真實的簡化版本。 我試圖在模型對象上放置一個PropertyChangeListener,但是隻要我點擊一個視圖狀態(它通過一些行爲和決策狀態定義),該監聽器就消失了。我最終不得不實施一個on-enter方法來將模型的一個副本放在流程範圍中,並且在出口處檢查該模型。 – Jason

+0

我明白了。如此類似的想法,除了你在流量控制器外部而不是xml – rptmat57

+0

是的。在狀態圖中繪製時,流程太複雜,無法在XML中進行建模,因此大多數情況下每個操作狀態在流量控制器中都有一個方法。 – Jason