Как визуализировать шаблон, отличный от приложения.hbs в EmberJS?

в EmberJS основным файлом шаблона является application.hbs. Любой шаблон вынесла из маршрутов идет {{outlet}} этого основного файла шаблона.

теперь у меня есть другой основной файл шаблона, скажем print.hbs при этом дизайн шаблона очень отличается от приложения.ОБДХ. Как мне это сделать?

в файле маршрутизатора у меня есть:

App.Router.map(function() {

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

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

маршруты dashboard и anything использует application.hbs. Что мне делать, чтобы использовать print.hbs на print маршрут? Пожалуйста помочь.

1 ответов


вы не можете легко изменить шаблон приложения. Эмбер не слушает 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")
});

Это JSBin продемонстрирует, почему это, к сожалению,тоже не работает. Согласно этот сообщение об ошибке, руль Эмбер путается, когда есть несколько outlet директивы на одной странице, даже если они находятся в разных #if областей.

пока это не будет исправлено, я предлагаю следующее, слегка измененное решение.

шаблон приложения пуста. По одному шаблону для обычного и печатного разделов.

  <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 здесь.