次の 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'
ユーザーがアプリケーションに入力した URL に関係なく、ナビゲーション アウトレットを接続したいので、ルート ルートの connectOutlets を使用しています。
問題は、ルーターが作成されるとすぐに、ルートの 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 ロジックの穴ですか、それとも設計によるものですか?