一组Ember路由的布局,不影响URL

时间:2014-11-06 15:54:18

标签: ember.js

我们说我有一个以下的路由器:

Router.map(function() {
  this.route('intro');
  this.route('about');
  this.route('terms-of-use');
});

我想要做的是为路由aboutterms-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和其他路线的不同内容。但它会造成一些混乱。

然后可以使用aboutterms-of-use的自定义基本路由类以及模拟父模板的覆盖renderTemplate。但是这看起来也不会很好,模板嵌套的配置会分布在整个应用程序中。

在路由器中执行它似乎是最佳的,但它可能吗?

我目前的解决方案是ApplicationController

上的此标记
anotherLayout: function() {
  return ['about', 'terms-of-use'].indexOf(this.currentRouteName) !== -1;
}.property('currentRouteName')

1 个答案:

答案 0 :(得分:1)

很遗憾,您无法定义一条没有网址的路线(当您执行{ path: '/' }时,您可以,但只能执行一次 - 很可能不会这样做)

好消息是,您可以为aboutterms-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/