1

在 Ember.StateManager 的文档中说:“在一个动作方法内部,给定的状态应该委托其 StateManager 上的 goToState 调用”。这是否意味着如果我发送一个动作消息,我必然需要转换到另一个状态。是否可以保持相同的状态,但通过发送动作来完成某些任务?例如,我处于“加载”状态并运行两个操作“预处理”和“显示”。

4

2 回答 2

2

非常简单:一个动作消息可以但不必转换到另一个状态。

您没有问过但相关且重要的事情:调用or方法是goToState一个坏主意和坏设计。enterexit

于 2012-05-22T02:55:39.437 回答
1

通常在处理状态图时,您可以做任何您想做的事情。在事件处理程序中切换状态不是强制性的。一个常见的情况是显示取消/保存对话框的事件处理程序。您可以轻松地将对话框放在事件处理程序中的页面上,并根据按下的按钮进行相应的处理。

一个单独的问题是每个事件处理程序基本上是否应该进入另一个状态。在上述场景中,您当然可以进入“确认”状态,state-enter 方法将显示对话框,并且会有两个处理程序,每个按钮一个。这些处理程序将依次转到其他州。

我认为这两种设计选择同样有效,至少在那种情况下是这样。 如果 你选择为每个动作实现一个单独的状态,你最终会得到很多小而简洁的状态。 如果您选择在事件处理程序本身中做一些事情,您的状态会更大,但它们会更少。

我要说的一件事是,如果事件处理程序变得复杂,您可能最好使用新状态。另外,要保持一致。

对于您的特定场景,如果我没看错,您希望加载数据,然后根据事件更改显示以显示数据。在这种情况下,我会使用新的状态。

所以你按下一个按钮来启动这个过程

  • 在事件处理程序中,进入某种“MyDataSection”状态
  • 初始子状态是“loadData”
  • 'loadData' 的进入状态方法开始加载过程
  • 'loadData' 中的事件处理程序 'dataLoaded' 在数据加载时进行处理;这意味着您需要在数据加载时触发一个事件
  • “dataLoaded”事件进入“显示”状态
  • show state 显示视图(或删除活动指示器等)并处理来自显示的任何事件。

这里的好处是,如果你有多种方式可以到达应用程序的这个部分,所有导致这个部分的操作只需要进入这个状态,一切都会发生同样的事情。另请注意,由于视图事件处理程序处于显示状态,如果用户在数据加载时点击按钮,则不会发生任何事情。

于 2012-05-21T16:12:27.490 回答