即使我的路由是嵌套的,我用于处理嵌套和非嵌套模板的方法是使用命名插座。Ember 让这一切变得非常简单。
我有一个顶级菜单出口,它始终包含与所访问路线相关的菜单。
示例应用程序模板:
<div id="nav">
{{partial "nav"}}
</div>
<div id="menu">
{{outlet "menu"}}
</div>
<div id="main">
{{outlet}}
</div>
{{outlet "modal"}}
我有两个命名的出口,“菜单”和“模式”,它们用于保存不嵌套但被嵌套路由或任何精确路由使用的内容。任何路由都可以将响应动作的模式渲染到全局“模态”出口,类似地,任何路由都可以将菜单渲染到“菜单”出口。
我的示例使用咖啡脚本。
路由器:
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,
...