创建路由器时,Ember.js connectOutlets在根目录上运行

创建路由器时,Ember.js connectOutlets在根目录上运行,ember.js,Ember.js,我有以下余烬路由器定义: 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 '

我有以下余烬路由器定义:

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是什么,都能连接导航出口

问题是,一旦创建路由器,根connectOutlets就会启动,这是在路由器通过runInjections注入控制器之前

如果我以叶子路线连接这些插座,一切正常,但这不是我想要的

如果我无法使用根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逻辑还是设计中的一个漏洞?

我通常认为根状态是特殊的,所以我不使用这个状态的连接端口。实际上,这意味着根状态(响应URL“/”)将重定向到“主”状态,我将把您的connectOutlets放在其中

这样做的好处是,您不会遇到尚未注入的控制器问题,但这也意味着,如果不使用历史API,您的“默认”URL将类似于yoursite.com/#/home,如果使用历史API,您的“默认”URL将类似于yoursite.com/home


在这两种情况下都不是很理想,但至少你没有将Ember.run.next硬塞进你的connectOutlets,这似乎是一种糟糕的形式,可能会带来一系列其他问题。我想你不会的,但是你现在期望你的控制器会在现在到下一个运行循环触发时被注入。。。这可能是也可能不是这样…

我通常认为根状态是特殊的,所以我不使用这个状态的连接口。实际上,这意味着根状态(响应URL“/”)将重定向到“主”状态,我将把您的connectOutlets放在其中

这样做的好处是,您不会遇到尚未注入的控制器问题,但这也意味着,如果不使用历史API,您的“默认”URL将类似于yoursite.com/#/home,如果使用历史API,您的“默认”URL将类似于yoursite.com/home

在这两种情况下都不是很理想,但至少你没有将Ember.run.next硬塞进你的connectOutlets,这似乎是一种糟糕的形式,可能会带来一系列其他问题。我想你不会的,但是你现在期望你的控制器会在现在到下一个运行循环触发时被注入。。。可能是这样,也可能不是这样