如何在EmberJS中渲染除application.hbs之外的模板?

时间:2014-06-11 09:09:46

标签: templates ember.js

在EmberJS中,主模板文件是application.hbs。从路由呈现的任何模板都是此主模板文件的{{outlet}}

现在,我有另一个主模板文件,比如print.hbs,其中模板设计与application.hbs非常不同。我该怎么做?

在路由器文件中,我有:

App.Router.map(function() {

    this.resource('print', function() {
        this.route('display1');
        this.route('display2');
    });

    this.route('dashboard', {path: '/'});
    this.route('anything');
});

路由dashboardanything使用application.hbs。 如何在print.hbs路线上使用print?请帮忙。

1 个答案:

答案 0 :(得分:4)

您无法轻松更改应用程序模板。当您尝试自己重新渲染模板时,Ember不会监听templateName属性更改并且响应不佳。

执行此操作的一种好方法是根据您是处于“屏幕”还是“打印”模式,在应用程序模板中使用不同的部分。

  <script type="text/x-handlebars">
    {{#if isPrint}}
      {{partial "application-print"}}
    {{else}}
      {{partial "application-normal"}}
    {{/if}}
  </script>

  <script type="text/x-handlebars" data-template-name="application-normal">
    <div id="app-normal">
      <h2>Normal template</h2>

      {{outlet}}
    </div>
  </script>

  <script type="text/x-handlebars" data-template-name="application-print">
    <div id="app-print">
      <h2>Print template</h2>

      {{outlet}}
    </div>
  </script>
App.ApplicationController = Ember.Controller.extend({
  isPrint: false,
  currentPathChange: function () {
    var currentPath = this.get("currentPath");
    var isPrint = currentPath ? currentPath.indexOf("print") === 0 : false;
    this.set("isPrint", isPrint);
  }.observes('currentPath').on("init")
});

This JSBin将证明为什么不幸的是,这也不起作用。根据{{​​3}},当同一页面中有多个outlet指令时,即使它们位于不同的#if范围内,Ember的把手也会感到困惑。

在此问题得到解决之前,我建议采用以下略有修改的解决方案。

应用程序模板为空。正常和打印部分各有一个模板。

  <script type="text/x-handlebars">
    {{outlet}}
  </script>

  <script type="text/x-handlebars" data-template-name="normal">
    <div id="app-normal">
      <h2>Normal template</h2>

      {{outlet}}
    </div>
  </script>

  <script type="text/x-handlebars" data-template-name="print">
    <div id="app-print">
      <h2>Print template</h2>

      {{outlet}}
    </div>
  </script>

在路由器中,一切都进入正常和打印资源。普通资源放在/,以便所有链接保持不变。在ApplicationController中无需特殊编码。

App.Router.map(function() {
  this.resource("print", function () {
    this.route("a");
    this.route("b");
  });

  this.resource("normal", {path: "/"}, function () {
    this.route("a");
    this.route("b");
  });
});

工作jsbin this bug report