在视图状态或动作状态中评估标签有什么区别

What’s difference between evaluate tag in view state or in action state

我想通过调用一个函数并在流作用域中设置一些变量来实现到另一个视图的转换。成功或错误事件没有区别。我知道,我可以在视图状态和操作状态中使用评估标记来调用函数。在每个标签中放置评估标签有什么区别吗?对于这种情况,哪个更好?

WebFlow 在某种意义上是灵活的,您可以通过 'on-entry' 和 'on-exit' 标记或在动作状态标记中在任何状态下执行计算表达式。与任何允许灵活性的框架一样,最好选择一种在所有流程中保持一致的策略。您可以简单地在 'view-state' 内的 'on-entry' 或 'on-render' 标记内执行求值表达式,但是使用中介 'action-state' 来执行您的表达式是有好处的,然后再过渡到'view-state'。

优点:

有时您必须计算多个表达式,但它们都是同一个 'action' 的一部分。将这些多个评估分组到 'action-state' 并为 'action-state' 提供一个有意义的 id 名称可能有助于流程的可读性和潜在的故障排除,如果在该操作状态下抛出异常。

例如,

假设我们在呈现 'view-state' 之前必须调用 3 种不同的服务方法。我们可以这样做:

<view-state id="myViewState" view="myViewFile" model="entity">
   <on-entry>
       <evaluate expression="myService.findObjById(id)" result="flowScope.model" />
       <evaluate expression="myService.updateUserStats(someField)"/>
       <evaluate expression="myService.performSomeOtherAction()"/>
   </on-entry>

</view-state> 

这会工作得很好,但如果我们从 'on-entry' 中删除所有这些服务方法调用并将它们放在它们自己的 'action-state' 中,一旦完成执行然后转换到 'view-state'

<action-state id="prepareMyViewState">
       <evaluate expression="myService.findObjById(id)" result="flowScope.model" />
       <evaluate expression="myService.updateUserStats(someField)"/>
       <evaluate expression="myService.performSomeOtherAction()"/>
       <transition to="myViewState"/>
</action>

<view-state id="myViewState" view="myViewFile" model="entity">

</view-state>

这两个示例都是 "correct",但带有动作状态的示例更为冗长,并且清楚地定义了关注点分离。因此,如果在操作状态 'prepareMyViewState' 中抛出异常,我们从名称中确切地知道此操作状态的作用与视图状态 'myViewState' 抛出的异常相反,这可能与两者相关视图状态的准备或渲染。此外,将来如果您想要 add/edit/remove 服务调用,当它们以有意义的名称 'prepareMyViewState' 置于自己的操作状态时,您可以轻松地在流文件中发现它。

再次,我要强调这里没有错误的答案我只想说选择一个 'style' 在整个 web-flow 应用程序中是一致的。具有中间动作状态的第二种样式是我要使用的样式。