【问题标题】:States in Ember.js without using routes?Ember.js 中的状态不使用路由?
【发布时间】:2012-06-26 23:04:25
【问题描述】:

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

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

myEmailClient.com#composingMessage_userHasSpecifiedRecipient_userIs...

有这方面的例子吗?

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

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

【问题讨论】:

    标签: routes ember.js statechart


    【解决方案1】:

    您可以将路由器位置实现更改为“无”以禁用此功能。其他方法是 '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'
        })
    });
    

    【讨论】:

    • 我还刚刚发现了一个相当新的example by Yehuda,它使用 Ember.StateManager 而不是 Ember.Router。后者是文档使用的。它们有什么区别?
    • 另外,关于我上面的第二个问题,如果我想要一些与路由耦合的状态子集怎么办?在那种情况下,我不希望完全禁用位置。 (不过,如果这种混合很困难,它就不是那么重要了,我可以通过其他方式实现路由。)
    • 哦,或者我应该有两个不同的 StateManager,一个有位置,一个没有?
    • 最近几周,state-manager/route-manager API 似乎是一个移动的目标。除非您可以为给定示例生成有效的 jsfiddle,否则假设 Yehuda 中的任何示例都描述了最有可能被后续工作破坏的正在进行中的工作。
    • @SamFen 这个要点已被弃用。三四个星期前,他们肯定将路由器功能从 StateManager 中分离出来。(参见 Mixin 可路由) Ember.Router 是 Ember.StateManager + Ember.Routable。为了回答您的问题,他们在 DS.Model 类中使用 Ember.StateManager(参见 ember-data)
    【解决方案2】:

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

    对于使用 StateManager 的示例,Ember.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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 2020-10-07
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多