我试图了解Ember.js中的国家是否仅被设计/假设在路线管理器中定义,以及路线是否与Ember不可分割。几乎所有我见过的guides似乎都假设您希望状态和路线完全匹配。
我想创建不依赖于路由的状态,而只是创建应用程序的状态。例如,在电子邮件客户端中,我可能具有“userHasSpecifiedRecipient”状态。仅当此状态为true时,才可以启用表单的消息框。但显然我不希望网址是:
myEmailClient.com#composingMessage_userHasSpecifiedRecipient_userIs...
等。
有这样的例子吗?
第二个问题:我可以混合与路线和状态相结合的状态吗?
最后:我看到一些建议,如果他们想要并发状态之类的东西,建议人们使用Ember的sproutcore-statechart插件。这仍然是真的吗?
答案 0 :(得分:4)
在EmberJS中,有一个Finite State Machine,Ember.StateManager的实现。 StateManager使用Ember.State表示状态机中的状态,具有enter
和exit
函数等。查看Class: Ember.StateManager。
对于使用StateManager的示例,Ember.View使用它来管理View的不同状态。另一个例子是Ember-Data,它使用状态管理器来跟踪记录可以具有的不同状态。
为了让生活更轻松并避免使用样板代码,最新版本的EmberJS中有一个Router
实现,它仍然是一个正在进行中的工作,每周更新一次或两次。您可以在GitHub downloads找到最新信息。
Ember.Router
是Ember.StateManager
的子类,负责提供基于URL的应用程序状态检测。应用程序的Ember.Router
实例在应用程序加载时检测浏览器URL,并尝试将其与特定应用程序状态进行匹配。此外,路由器将更新URL以反映应用程序的状态随时间的变化。 (JSDoc in Ember source)
此外,由于Ember.Router
扩展Ember.StateManager
和Ember.Route
扩展Ember.State
,因此可以互换。事实上,只需要一天的时间就可以获得更多的支持,以支持州和路线的混合,请参阅Support basic States inside of Routes。
答案 1 :(得分:2)
您可以将路由器位置实施更改为“无”以禁用此功能。其他方法是'hash'或'history'(使用github上的当前ember-latest.js)。
App.Router = Ember.Router.extend({
location : Ember.Location.create({
implementation : 'none'
})
});