Метр: встраивание шаблонов в Blaze

Используя Bootstrap и Meteor / Blaze, я пытаюсь динамически контролировать размер шаблона с помощью помощника шаблона. Я хотел бы иметь кнопку для переключения между col-md-4 и col-md-12. Жестко закодированный размер столбца выглядит следующим образом:

<div class="panel-body">
  <div class="row">
   {{#each articles}}
      <div class="col-md-4">
         {{> article this}}
      </div>
   {{/each}}
 </div>

У меня есть помощник шаблона, который возвращает div и обнаружил, что мне нужен закрывающий вызов помощника, иначе Meteor может жаловаться на несбалансированный <\ div>. Это кажется немного хакерским.

Template.articles.helpers({
  format: function() {
      return '<div class="col-md-4">';
      // return '<div class="col-md-12">';
  },
  end_format: function() {
      return '</div>'
  }
});

Разметка это:

<div class="panel-body">
  <div class="row">
      {{#each articles}}
          {{{format}}}
              {{> article this}}
          {{{end_format}}}
      {{/each}}
   </div>
</div>

Но теги div возвращаются закрытыми и пустыми, с разметкой, которую я хотел бы заключить внизу, как видно на этом снимке экрана:

1 ответ

Решение

Не возвращайте HTML от помощников по шаблонам, обычно есть лучший способ.

Почему бы вам не вернуть динамическое имя класса из помощника шаблона?

HTML

<div class="panel-body">
  <div class="row">
    {{#each articles}}
      <div class="{{columnSize}}">
        {{> article this}}
      </div>
    {{/each}}
  </div>
  <button type="button" class="btn btn-primary js-toggle-column-size">Toggle column size</button>
</div>

ES2015

Template.articles.onCreated(function(){
  this.largeColumns = new ReactiveVar(false);
});

Template.articles.helpers({
  columnSize(){
    const largeColumns = Template.instance().largeColumns.get();
    return largeColumns ? 'col-md-12' : 'col-md-4';
  }
});

Template.articles.events({
  'click .js-toggle-column-size'(event, template){
    const largeColumns = template.largeColumns.get();
    template.largeColumns.set(!largeColumns);
  }
});
Другие вопросы по тегам