我们说我有一个以下的路由器:
Router.map(function() {
this.route('intro');
this.route('about');
this.route('terms-of-use');
});
我想要做的是为路由about
和terms-of-use
创建一个父模板而不修改它们的路径,例如:
Router.map(function() {
this.route('intro');
this.route('some-layout', /* zero length path options */) {
this.route('about');
this.route('terms-of-use');
}
});
我正考虑在ApplicationController
上放置一个标记,并在application
模板中使用它来显示intro
和其他路线的不同内容。但它会造成一些混乱。
然后可以使用about
和terms-of-use
的自定义基本路由类以及模拟父模板的覆盖renderTemplate
。但是这看起来也不会很好,模板嵌套的配置会分布在整个应用程序中。
在路由器中执行它似乎是最佳的,但它可能吗?
我目前的解决方案是ApplicationController
anotherLayout: function() {
return ['about', 'terms-of-use'].indexOf(this.currentRouteName) !== -1;
}.property('currentRouteName')
答案 0 :(得分:1)
很遗憾,您无法定义一条没有网址的路线(当您执行{ path: '/' }
时,您可以,但只能执行一次 - 很可能不会这样做)
好消息是,您可以为about
和terms-of-use
指定视图类。
App.AboutView = App.TermsOfUseView = Ember.View.extend({
layoutName: 'some-layout'
});
然后some-layout
Handlebars模板带有{{yield}}
帮助器,如下所示:
<div class="some-layout">
{{yield}}
</div>
以下是它的工作原理:当Ember呈现路径模板时,它首先检查是否存在视图类。如果是这样,它会设置它的template
属性。由于我们使用layout
属性,因此不会被覆盖。不太完美,因为它不会成为这些路线的真正父母,但在大多数情况下它可以胜任。
另外我认为Ember会支持你所描述的功能,因为它确实很有意义,而且我知道很多人都因为缺乏而受到影响(包括我在内)。
有关布局的更多信息:http://emberjs.com/guides/views/adding-layouts-to-views/