ルートがネストされている場合でも、ネストされたテンプレートとネストされていないテンプレートを処理するために使用したアプローチは、名前付きアウトレットを使用することです。Ember はそれをとても簡単にします。
訪問中のルートに関連するメニューを常に保持するトップレベルのメニューアウトレットがあります。
アプリケーション テンプレートの例:
<div id="nav">
{{partial "nav"}}
</div>
<div id="menu">
{{outlet "menu"}}
</div>
<div id="main">
{{outlet}}
</div>
{{outlet "modal"}}
「メニュー」と「モーダル」という 2 つの名前付きアウトレットがあります。これらは、ネストされていないが、ネストされたルートまたは正確には任意のルートで使用されるコンテンツを保持するために使用されます。どのルートもアクションに応じてモーダルをグローバルな「モーダル」アウトレットにレンダリングでき、同様にどのルートもメニューを「メニュー」アウトレットにレンダリングできます。
私の例では、coffeescript を使用しています。
ルーター:
App.Router.map ->
@resource "posts", ->
@route "create"
@resource "post", {path: ':id'}, ->
@resource "comments", {path: ':id'}, ->
@route "create"
@resource "comment", {path: ':id'}, ->
ネストされていない名前付きアウトレットにメニューをレンダリングするルート:
App.PostsIndexRoute = Em.Route.extend
renderTemplate: (controller, model)->
# default render
@_super arguments...
# render posts menu into the application menu outlet
@render "posts.menu",
outlet: "menu"
into: "application"
App.CommentsIndexRoute = Em.Route.extend
renderTemplate: (controller, model)->
# default render
@_super arguments...
# render comments menu into the application menu outlet
@render "comments.menu",
outlet: "menu"
into: "application"
上記のようにデフォルトのネストされたレンダリングを行う必要はありません。「コンテンツ」などの名前付きアウトレットに常にレンダリングするルート タイプを定義することもできます (Ember が使用するため、「メイン」と呼ばないでください)。
App.ContentRoute = Em.Route.extend
renderTemplate: (controller, model)->
@render outlet: "content", into: "application"
そして、常にアプリケーションの「コンテンツ」アウトレットにレンダリングする必要があるルートのサブクラスを作成します。
App.PostsIndexRoute = App.ContentRoute.extend()
App.CommentsIndexRoute = App.ContentRoute.extend()
しかし、Mixin を使用して行う方がよいでしょう。そうすれば、任意の懸念事項を任意のルートに簡単に含めることができます (たとえば、認証されたルートの懸念事項)。
App.RenderIntoContent = Em.Mixin.create
renderTemplate: (controller, model)->
@render outlet: "content", into: "application"
App.PostsIndexRoute = Em.Route.extend App.RenderIntoContent,
...
App.CommentsIndexRoute = Em.Route.extend App.RenderIntoContent,
...