2012-06-25 70 views
8

我想了解Ember.js中的国家/地区是否只设计/假定在路由管理器中定义,以及路由是否是Ember的组成部分。几乎所有我见过的guides似乎假设你想要的状态和路线完全匹配。Ember.js中的国家不使用路由?

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

myEmailClient.com#composingMessage_userHasSpecifiedRecipient_userIs...

是否有这方面的例子?

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

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

回答

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

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' 
    }) 
}); 
+1

我也刚刚找到一个相当新近的[使用Ember.StateManager代替Ember.Router]的[Yehuda](https://gist.github.com/2679013)示例。后者是文档使用的内容。他们之间有什么区别? –

+0

另外,至于我上面的第二个问题,如果我想要有一些与路由耦合的状态子集,该怎么办?在那种情况下,我不希望完全禁用位置。 (如果这种混合很困难,但它并不重要,我可以用其他方式实现路线。) –

+0

哦,还是应该我可能有两个不同的StateManagers,一个有位置,一个没有? –