はメインレイアウトにページのtarget
内容をラップするためにいくつかの方法を提供します。これにより、共通のページレイアウトを別のファイルに分割し、小さなターゲットテンプレートを別のファイルに分割することができます。
Emberでこれを数回反復しましたが、現在のところ、この機能は{{outlet}}
ヘルパーによって提供されています。アウトレットはEmberからyield
へのレイアウトです。
outlet
が大きく広がる領域は、yield
と重複しています。サーバーサイドでの収穫ははるかに簡単です。テンプレートの領域にマークしてから、指定されたターゲットにコンテンツのブロックを生成するために呼び出す必要があります。
しかし、コンテンツのレンダリングがクライアント側のJavaScriptに切り替えられた場合、必要に応じてページの一部だけが更新されます。単にマーカーyield
に直接入れることはできません。あなたはもっとスマートなyield
が必要です: - outlet
。
{{outlet}}
には2つの辺があります。
- 降伏したい場所を示すマーカー。これは
{{outlet}}
ヘルパーです。
- このアウトレットにテンプレートをレンダリングするコード。これは、
renderTemplate
フック内で使用されるrender
メソッドです。
デフォルトでは、{{outlet}}
は名前を必要としません。これにより、そのテンプレートのデフォルト出口になります。テンプレートには多数のアウトレットがあり、名前を付けることで指定できます。たとえば: -
{{outlet 'sidebar'}}
{{outlet 'nav'}}
これは、 'sidebar'と 'nav'という2つのアウトレットを宣言しています。これらのアウトレットに他のテンプレートをレンダリングできるようになりました。
デフォルトのアウトレットは、アウトレット名が明示されていない場合に使用されます。指定されたアウトレットについては、レンダリングはrenderTemplate
フックのrender
をRoute
と呼んで行います。 オプションとしてrender
メソッドに渡されたハッシュにoutlet
オプションを指定することでこれを実行します。ここで
renderTemplate() {
this.render('recentPosts', { outlet: 'sidebar' });
}
、テンプレートrecentPosts
は、その親テンプレート内の「サイドバー」という名前のコンセントにレンダリングされます。
ルートが他のネストされたルートの中にネストされている場合、ルートは最も近い親アウトレットにレンダリングされます。親リソースにデフォルトのアウトレットがない場合は親が使用され、application
テンプレートに達するまで続きます。
にresource
をthis.resource('posts');
と宣言すると、規約に基づいていくつかのことが示されます。
- レイアウトテンプレート
posts
とposts
ルートをレンダリングします。
- オプションで、暗黙の
posts.index
ルートをテンプレートposts/index
でレンダリングします。
posts
テンプレートには、すべての投稿とそのサブリソースに共通のレイアウトが含まれています。最低でも、少なくとも{{outlet}}
のようなデフォルトのコンセントを含む必要があります。
これがない場合、{{outlet}}
子ルートには、すぐにレンダリングする親コンセントはありません。彼らはその親の親をレンダリングするか、最終的にテンプレートのアウトレットをレンダリングします(application
)。これが起こると、"The immediate parent route did not render into the main outlet ..."
の警告が表示されます。この場合、outlets
の場所を確認してください。
posts.index
は、ネストされたルートを持つすべてのリソースに与えられる暗黙のルートです。つまり、リソースにネストされたルートがある場合は、ネストされた、this.route('index
) `を明示的に宣言する必要はありません。
このindex
ルートは、そのリソースの内容を表示できます。たとえば、posts.index
の場合、すべてposts
のリストを表示できます。この暗黙的なルートを持つ2番目の注意点は、モデルが親のposts
ルート上にあることです。 PostsIndexController
でこのモデルを取得するには、needs
APIを使用する必要があります。
さらに、このposts.index
ルートはオプションです。投稿のリストを表示するために使用されるposts/index
のUIをposts
テンプレート自体に直接配置することができます。しかし、これはどんな子リソースもposts
の出口に沿って、投稿のリストでレンダリングすることを意味します。明示的なインデックスルートを使用するかどうかの決定は、表示する必要があるUIによって異なります。
上記以外のテンプレートには、application
というテンプレートがあります。ネストされたリソースをレンダリングするためにはoutlet
が必要で、通常はページに共通のレイアウトが格納されます。アプリケーションテンプレートを指定しない場合は、デフォルトのテンプレートが使用されます。この生成されたテンプレートは、{{outlet}}
に相当します。 - デフォルトのアウトレットのみを持つテンプレート。
以下の経路を考慮してください。ここで
App.Router.map(function() {
this.resource('posts', function() {
this.route('new')
this.resource('post', {path: ':post_id'}, function() {
this.resource('comments', function() {
this.route('new');
});
});
});
});
、
posts.new
は
application
テンプレートのデフォルトのコンセントにレンダリングされます
posts
内部でレンダリングされます
posts
、にレンダリングされます。残りのテンプレートは次のとおりです。
+---------------------------+--------------------------------------------------------+
| Route | Templates used (default outlets) |
+---------------------------+--------------------------------------------------------+
| posts.index | posts.index > posts > application |
+---------------------------+--------------------------------------------------------+
| posts.new | posts.new > posts > application |
+---------------------------+--------------------------------------------------------+
| posts.post.index | post.index > post > posts > application |
+---------------------------+--------------------------------------------------------+
| posts.post.new | post.new > post > posts > application |
+---------------------------+--------------------------------------------------------+
| posts.post.comments.index | comments.index > comments > post > posts > application |
+---------------------------+--------------------------------------------------------+
| posts.post.comments.new | comments.new > comments > post > posts > application |
+---------------------------+--------------------------------------------------------+
このデフォルトのテンプレート階層はrender
方法にinto
オプションを指定することで変更することができます。ここで
renderTemplate: function() {
this.render('posts', { into: 'sidebar' })
}
posts
テンプレートはsidebar
テンプレートのデフォルトのコンセントにレンダリングされます。
それはそれです。 Outlet
は、設定よりも多くの慣例を使用する別のエバーコンセプトです。デフォルトは非常に優れており、同時にカスタマイズも簡単です。
Darshanの概要をありがとう。 Route - > Templatesテーブルは、何かを明確にするのに役立ちます。私は完全にそれをgrokする前に、私はこのカップルより多くの時間を読むでしょう。ネスティングの振る舞いについては、私の心の中でまっすぐにする必要があります。 –
ここで、「posts.post.new」というルートを定義しましたか? –
@Darshanあなたはemberjsのルーターの挙動にも対処するという私の質問を見ることができますか? http://stackoverflow.com/questions/17780344/nested-routing-behavior-for-ember-js –