4

在使用 SCXML 制作的状态机中,有没有办法为转换设置动态目标值?

我的意思是,假设我有一个名为“obj”的对象,它已被设置为 scxml 的数据模型。因此可以在其上设置条件(如果对象中有一个名为 checkCondition 的属性),例如:

cond="obj.checkCondition"

<state id="state1">
    <transition cond="obj.checkCondition" target="state2"/>
</state>
<state id="state2">
    ...
</state>

我在 obj 中有另一个属性,称为 nextTarget。我想在这个转换中设置目标,从对象中读取它的值(因为它在条件中完成)。

<state id="state1">
    <transition cond="obj.checkCondition" target="eval(obj.nextTarget)"/>
</state>
<!-- Where in obj.nextTarget there it has been set as value "state1", "state2" or any state name -->

有什么语法可以做到这一点吗?

谢谢。

4

4 回答 4

2

您可以在过渡元素中指定 cond 属性

<transition cond="data.value > 10" target="state2"/>
于 2012-07-10T03:00:47.727 回答
0

尽管@Charles Goodwin 的回答非常准确......我可以补充一下。简化:

  • 你的设计中有什么:你有一个过渡 my_transition
  • 你会喜欢什么:这种转变可能会导致几个 state_targets

你完全隐藏了问题的逻辑。

你应该拥有的:几个过渡

  • my_transition_A 目标状态_A_target
  • my_transition_B 目标 state_B_target
  • my_transition_C 目标 state_C_target
  • my_transition_D 目标 state_D_target...

并且将在您的设计中动态设置目标的过程将动态处理 my_transition_A 或 my_transition_C 的事件......就像它会在您的设计中选择 target_state 一样)。

于 2012-10-12T11:15:54.633 回答
0

您正在尝试构建非常面向应用程序的复杂状态机框架。这有点像为每个电子表格应用程序构建自己的电子表格框架,而不是使用 EXCEL。更好的方法可能是使用现有框架并在 SCXML 中定义您的事件和操作。您可以在 www.StateSoft.org -> State Machine Gallery 中查看 SM API 框架的示例。

-雅努斯

于 2011-09-21T17:55:53.260 回答
0

SCXML 是对状态和这些状态之间可能的转换的相当简单的描述。没有条件转换之类的东西。

但是,您可以从每个状态进行多个转换。您从一个状态进行的转换次数没有限制。

所以你的问题的答案是你有尽可能多的转换来描述你想要去的条件方向,你评估其他地方的条件(即在Java中)。

示例来源是SCXML Wikipedia 条目

<state id="ready">
    <transition event="watch.start" target="running"/>
</state>
<state id="running">
    <transition event="watch.split" target="paused"/>
    <transition event="watch.stop" target="stopped"/>
</state>
<state id="paused">
    <transition event="watch.unsplit" target="running"/>
    <transition event="watch.stop" target="stopped"/>
</state>
<state id="stopped">
    <transition event="watch.reset" target="ready"/>
</state>

在此处输入图像描述

于 2011-09-21T18:08:25.530 回答