1

我有以下 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,我都希望连接导航出口。

问题是,一旦创建了路由器,根 connectOutlets 就会触发,这是在路由器通过 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 逻辑中的一个漏洞还是有意设计的?

4

1 回答 1

1

我一般认为根状态是特殊的,所以我不使用connectOutlets这个状态。在实践中,这意味着根状态(响应 URL '/')重定向到“家”状态,我将在其中放置您的 connectOutlets。

这样做的好处是您不会遇到控制器未注入的问题,但这也意味着如果不使用 History API,您的“默认” URL 将变为 yoursite.com/#/home 之类的东西,并且yoursite.com/home 如果你是。

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

于 2012-11-28T15:04:15.773 回答