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

时间:2012-03-29 13:57:09

标签: javascript model-view-controller viewstate ember.js state-management

Ember.js中的StateManager还没有很好的记录,所以我对它的使用有一些疑问。

  1. 是否应该只在州经理内部致电.goToState
  2. 我有时发现自己在视图中的状态管理器中镜像方法,例如save: -> StateManager.send("save")。这有意义还是我错过了什么?
  3. 模型的所有修改(通常)都应该通过州经理吗?
  4. 如果一个视图具有不同的状态,是应该使用带有子状态的ViewState建模,还是应该使用计算属性和视图属性仅在视图中保存该信息(没有状态管理器知道查看内部状态)?*
  5. * 一个示例可以是三步形式,其中相同的模板用于所有状态,但在三个步骤中显示/隐藏不同的区域。

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

2 个答案:

答案 0 :(得分:6)

关于你的观点 2

  

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

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

{{action "send" target="App.stateManager"}}

send事件将发送到您的App.stateManager

答案 1 :(得分:6)

  

是否应该只在州内调用.goToState   经理?

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

  

我有时发现自己在州内镜像方法   视图中的经理,例如保存: - > StateManager.send("保存&#34)。是否   有意义还是我错过了什么?

我喜欢pangratz对此的评价。

  

应该全部修改   模特(一般)经过国家经理?

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

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

  

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

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

出于好奇,您是来自网络开发背景还是桌面/移动应用开发背景?我来自网络开发,状态图表对我来说是一个新概念。我发现David Harel阅读the canonical State Chart paper非常有用(' ware PDF!)。对于一篇学术论文来说,它具有令人惊讶的可读性,并列出了自2010年底以来大部分SproutCore / Ember世界一直在使用的基本状态图表概念(即Michael Cohen当他想到的时候写了Ki。)