我有一个复杂的webflow设置,允许在流程中进行前进和后退导航。此Webflow有一个支持对象,我们称之为flowModel。
因此,查看状态看起来像这样:
<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>
当我从其中一个选择页面中选择某个内容,在摘要中查看它,然后返回到流程中并做出不同的选择时,会出现问题。摘要页面仍将显示从原始路径计算的值。
在网络流程中,有没有办法确定模型中的字段值是否已更改?如果是这种情况,我可以在<on-exit>
或<action-state>
中手动更改“已计算”值。否则,我唯一的想法就是在<on-start>
内的<on-render>
或<view-state>
阶段附加一个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>
在流控制器内部,on render和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。
答案 0 :(得分:1)
<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>