8

我试图了解 Ember.js 中的状态是否仅设计/假定为在路由管理器中定义,以及路由是否是 Ember 不可或缺的。我见过的几乎所有指南似乎都假设您希望状态和路线完全匹配。

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

myEmailClient.com#composingMessage_userHasSpecifiedRecipient_userIs...等等

有这方面的例子吗?

第二个问题:我可以混合与路由耦合的状态和不耦合的状态吗?

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

4

2 回答 2

4

在 EmberJS 中,有一个有限状态机Ember.StateManager 的实现。StateManager 使用 Ember.State 来表示状态机中的状态,有enterexit功能等。看看Class: Ember.StateManager

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

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

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

此外,由于Ember.RouterextendsEmber.StateManagerEmber.Routeextends Ember.State,它们是可以互换的。事实上,仅仅一天,就为支持状态和路由的混合提供了更多支持,请参阅Support basic States inside of Routes

于 2012-06-28T00:03:49.763 回答
2

您可以将路由器位置实现更改为“无”以禁用此功能。其他方法是“哈希”或“历史”(使用 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'
    })
});
于 2012-06-25T18:47:29.820 回答