在创建路由器的那一刻,Ember.js connectOutlets在root上运行

时间:2012-11-28 07:19:06

标签: ember.js

我有以下ember路由器定义:

WZ.Router = Em.Router.extend
  enableLogging: true
  location: 'hash'
  showHome: Ember.Route.transitionTo 'root.index'
  root: Em.Route.extend
    initialState: 'index'
    connectOutlets: (router, event) ->
      unless router.get 'initialized'
        router.get('applicationController').connectOutlet 'nav', 'navbar'
        router.get('homeController').connectOutlet 'bottombar', 'bottombar'
        router.set 'initialized', true

    index: Em.Route.extend
      route: '/'
      connectOutlets: (router, event) ->
        router.get('applicationController').connectOutlet 'home'

我正在使用根路由的connectOutlets,因为无论用户输入应用程序的哪个URL,我都希望连接导航插座。

问题在于,一旦创建路由器,根连接器就会触发,这是在路由器通过runInjections注入控制器之前。

如果我在叶子路线上连接这些插座,那么一切都有效,但这不是我想要的。

如果我无法使用root connectOutlets,无论用户进入应用程序的哪个URL或路由,我怎样才能最好地确保导航插座连接?

我们是否还应该禁止在叶子路由上覆盖connectOutlets,因为如果没有控制器等连接它就没用了?

编辑:我通过使用Ember.run.next解决了这个问题:

WZ.Router = Em.Router.extend
  enableLogging: true
  location: 'hash'
  showHome: Ember.Route.transitionTo 'root.index'
  root: Em.Route.extend
    connectOutlets: (router, event) ->
      Ember.run.next @, ->
        unless router.get 'initialized'
          router.get('applicationController').connectOutlet 'nav', 'navbar'
          router.get('homeController').connectOutlet 'bottombar', 'bottombar'
          router.set 'initialized', true
    index: Em.Route.extend
      route: '/'

但这仍然不太理想。这是Em逻辑中的漏洞还是设计?

1 个答案:

答案 0 :(得分:1)

我通常认为根状态是特殊的,所以我不使用connectOutlets来处理这个状态。在实践中,这意味着根状态(响应URL'/')重定向到“home”状态,我将把你的connectOutlets置于其中。

这样做的好处是你没有遇到控制器 - 未注入的问题,但这也意味着如果不使用历史记录,你的“默认”网址就像yoursite.com/#/home API,和yoursite.com/home,如果你是。

在任何一种情况下都不是很理想,但至少你并没有将Ember.run.next整理到你的connectOutlets中,这似乎是一种糟糕的形式,可能会带来一系列其他问题。我想你不会,但你现在期待你的控制器将在现在和下一个运行循环开始之间注入......那可能是也可能不是......