假设我有以下路由器:
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
使用自定义基本路由类,并使用模拟父模板的overriden renderTemplate
。但这看起来也不太好,模板嵌套的配置将扩展到整个应用程序。
在路由器中这样做似乎是最理想的,但有可能吗?
我目前的解决方案是ApplicationController
上的这个标志
anotherLayout: function() {
return ['about', 'terms-of-use'].indexOf(this.currentRouteName) !== -1;
}.property('currentRouteName')
发布于 2014-11-11 17:07:00
不幸的是,您无法定义一个没有URL的路由(当您执行{ path: '/' }
时,您可以定义它,但只定义一次--这很可能不会)
好消息是您可以为about
和terms-of-use
指定视图类。
App.AboutView = App.TermsOfUseView = Ember.View.extend({
layoutName: 'some-layout'
});
然后是带有一个some-layout
助手的{{yield}}
手柄模板,如下所示:
<div class="some-layout">
{{yield}}
</div>
下面是它的工作原理:当Ember呈现一个路由的模板时,它首先检查是否存在一个视图类。如果是这样的话,它将设置它的template
属性。因为我们使用layout
属性,所以不会覆盖它。不是很完美,因为它不会是这些路线的真正家长,但在大多数情况下,它做的工作。
此外,我认为Ember会支持您描述的功能,因为它确实很有意义,而且我知道很多人都因为缺乏它而受苦(包括我)。
更多关于布局的信息:http://emberjs.com/guides/views/adding-layouts-to-views/
https://stackoverflow.com/questions/26783705
复制相似问题