向Ember.StateManager发送动作:goToState是强制性的吗?

时间:2012-05-21 15:49:02

标签: ember.js

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

2 个答案:

答案 0 :(得分:2)

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

您没有提出的问题,但是相关且重要:在goToStateenter方法中调用exit是一个坏主意和糟糕的设计。

答案 1 :(得分:1)

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

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

我认为两种设计选择同样有效,至少在那种情况下如此。 如果你选择为每个动作实现一个单独的状态,你将会得到许多小而简洁的状态。 如果你选择在事件处理程序中自己做事,你的状态会更大,但会有更少的状态。

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

对于您的特定情况,如果我正确读取它,您希望加载数据,然后根据事件更改显示以显示数据。在这种情况下,我会使用新的状态。

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

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

这里的好处是,如果您有多种方法可以访问应用程序的这一部分,那么导致此部分的所有操作只需要进入此状态,并且一切都将始终相同。另请注意,由于视图事件处理程序处于显示状态,如果用户在加载数据时按下按钮,则不会发生任何事情。