我有以下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逻辑中的漏洞还是设计?
答案 0 :(得分:1)
我通常认为根状态是特殊的,所以我不使用connectOutlets来处理这个状态。在实践中,这意味着根状态(响应URL'/')重定向到“home”状态,我将把你的connectOutlets置于其中。
这样做的好处是你没有遇到控制器 - 未注入的问题,但这也意味着如果不使用历史记录,你的“默认”网址就像yoursite.com/#/home API,和yoursite.com/home,如果你是。
在任何一种情况下都不是很理想,但至少你并没有将Ember.run.next整理到你的connectOutlets中,这似乎是一种糟糕的形式,可能会带来一系列其他问题。我想你不会,但你现在期待你的控制器将在现在和下一个运行循环开始之间注入......那可能是也可能不是......