关于Ember.js中StateManager的最佳实践

san*_*rom 12 javascript viewstate model-view-controller state-management ember.js

StateManager在Ember.js不说,有据可查的,所以我已经得到了有关其使用的一些问题.

  1. 是否应该.goToState只从国家经理内部打电话?
  2. 我有时会发现自己在视图中的状态管理器中镜像方法,例如save: -> StateManager.send("save").这有意义还是我错过了什么?
  3. 模型的所有修改(通常)是否应该通过州经理?
  4. 如果一个视图具有不同的状态,是应该使用ViewState带子状态建模,还是应该使用计算属性和视图属性仅在视图中保存该信息(没有状态管理器知道视图内部状态)?*

*一个示例可以是三步形式,其中相同的模板用于所有状态,但是在三个步骤中显示/隐藏不同的区域.

Github参考:https://github.com/emberjs/ember.js/tree/master/packages/ember-states/lib

pan*_*atz 6

关于你的观点2:

我有时会发现自己在视图中的状态管理器中镜像方法,例如save: -> StateManager.send("save").这有意义还是我错过了什么?

您可以action在Handlebars模板中使用帮助器并将StateManager设置为target

{{action "send" target="App.stateManager"}}
Run Code Online (Sandbox Code Playgroud)

并将send事件发送给您App.stateManager.


pjm*_*rse 6

是否应该努力只从州经理内部调用.goToState?

大概.我肯定不知道这一点,但在我看来,因为州经理知道你所处的状态,所以它是强制执行合法州过渡的地方.如果你从国家经理外面打电话给.goToState,你就是在没有真正知道自己处于什么状态的情况下这样做的,虽然这有时候可以(也许这是一个你可以从任何其他州获得的状态)但这不是一个好习惯将在.

我有时会发现自己在视图中的状态管理器中镜像方法,例如save: - > StateManager.send("save").这有意义还是我错过了什么?

我喜欢pangratz对此有何看法.

模型的所有修改(通常)是否应该通过州经理?

我使用状态图的方式,没有.我已经看到一些人使用状态图作为控制器层的完全替代品,但是,如果这是你的工作方式,那么是的,它应该通过状态管理器.模式是避免从视图中直接操纵模型; 无论是控制器层还是中间的状态管理器,对我来说都是一个没有实际意义的问题.

但是,我使用状态图表的方式是使状态管理器管理应用程序的状态.如果修改将改变应用程序的状态(例如,如果在更新完成时有进度指示器),它可以扮演流量管理器来修改模型,但在我看来,模型更新不是其任务的一部分; 他们属于控制者.

如果一个视图具有不同的状态,是应该使用具有子状态的ViewState建模,还是应该使用计算属性和视图属性仅在视图中保存该信息(没有状态管理器知道视图内部状态)?

我认为州经理需要知道(或应该知道)观点的内部状态.

出于好奇,您是来自Web开发背景还是桌面/移动应用程序开发背景?我来自网络开发,状态图表对我来说是一个新概念.我发现阅读David Harel 的规范状态图表文件非常有用('ware PDF!).对于一篇学术论文而言,这是令人惊讶的可读性,并列出了自2010年底以来大部分SproutCore/Ember世界一直在使用的基本状态图表概念(也就是Michael Cohen写Ki时的想法).

  • 另一个链接:Frozen Canuck又名Michael Cohen的状态图与控制器http://frozencanuck.wordpress.com/2011/03/09/sproutcore-statecharts-vs-controllers/.虽然对于SproutCore来说它仍然是一个有效的资源. (2认同)