Ember.js中的州没有使用路线?

时间:2012-06-25 16:48:53

标签: routes ember.js statechart

我试图了解Ember.js中的国家是否仅被设计/假设在路线管理器中定义,以及路线是否与Ember不可分割。几乎所有我见过的guides似乎都假设您希望状态和路线完全匹配。

我想创建不依赖于路由的状态,而只是创建应用程序的状态。例如,在电子邮件客户端中,我可能具有“userHasSpecifiedRecipient”状态。仅当此状态为true时,才可以启用表单的消息框。但显然我不希望网址是:

myEmailClient.com#composingMessage_userHasSpecifiedRecipient_userIs...等。

有这样的例子吗?

第二个问题:我可以混合与路线和状态相结合的状态吗?

最后:我看到一些建议,如果他们想要并发状态之类的东西,建议人们使用Ember的sproutcore-statechart插件。这仍然是真的吗?

2 个答案:

答案 0 :(得分:4)

在EmberJS中,有一个Finite State Machine,Ember.StateManager的实现。 StateManager使用Ember.State表示状态机中的状态,具有enterexit函数等。查看Class: Ember.StateManager

对于使用StateManager的示例,Ember.View使用它来管理View的不同状态。另一个例子是Ember-Data,它使用状态管理器来跟踪记录可以具有的不同状态。

为了让生活更轻松并避免使用样板代码,最新版本的EmberJS中有一个Router实现,它仍然是一个正在进行中的工作,每周更新一次或两次。您可以在GitHub downloads找到最新信息。

Ember.RouterEmber.StateManager的子类,负责提供基于URL的应用程序状态检测。应用程序的Ember.Router实例在应用程序加载时检测浏览器URL,并尝试将其与特定应用程序状态进行匹配。此外,路由器将更新URL以反映应用程序的状态随时间的变化。 (JSDoc in Ember source

此外,由于Ember.Router扩展Ember.StateManagerEmber.Route扩展Ember.State,因此可以互换。事实上,只需要一天的时间就可以获得更多的支持,以支持州和路线的混合,请参阅Support basic States inside of Routes

答案 1 :(得分:2)

您可以将路由器位置实施更改为“无”以禁用此功能。其他方法是'hash'或'history'(使用github上的当前ember-latest.js)。

https://github.com/joliss/ember.js/blob/50aff86ef5b6847108bc8c32364171815c230d36/packages/ember-application/lib/system/location.js

App.Router = Ember.Router.extend({
    location : Ember.Location.create({
        implementation : 'none'
    })
});