Meteor.js : Выполнить метод после заполнения списка

#javascript #meteor

#javascript #метеор

Вопрос:

Я только начал работать над пакетом meteorite, который добавляет группы / заголовки в списки.
Смотрите демонстрацию здесь.
Исходный код для демонстрации здесь .

По сути, то, что я хочу сделать, это дождаться полного заполнения списка, а затем вызвать метод, который задает заголовки / группы и т.д. То, как я делаю это сейчас, — это вызов помощника handlebars после {{#each}} цикла, например:

 <ul>
{{#each listItems }}
  {{> listItem }}
{{/each}}
</ul>

{{ groupList }}
  

Где groupList помощник выполняет код, который я хочу запустить после запуска цикла (код, который задает заголовки).

Это выглядит довольно некрасиво, и то, что я думаю, я бы предпочел, это что-то вроде обратного {{#each}} вызова цикла, который вызывается после завершения итерации (и, что важно, если элементы в цикле меняются).
Я думаю, что-то вроде метода rendered() для шаблонов.
(И я, конечно, уже пробовал метод rendered() , но он выполняется до запуска цикла.)

Существует ли такой обратный вызов? Или какой-либо другой метод, который был бы менее уродливым, чем тот, который я сейчас использую с помощником handlebars?

Ответ №1:

Вместо того, чтобы позволять Blaze отображать список, а затем использовать jQuery для добавления заголовков, вы могли бы выполнить группировку и заголовки в самом шаблоне, например:

 <template name="grouped">
  {{#each groups}}
    <h2>{{heading}}</h2>
    {{#each items}}
      {{> item}}
    {{/each}}
  {{/each}}
</template>
  
 Template.grouped.groups = function () {
  return _.chain(ListItems.find().fetch())
          .groupBy("wins")
          .pairs()
          .map(function (pair) {return {heading: pair[0], items: pair[1]};})
          .value();
};
  

Мне это кажется более «стремительным» — императивные манипуляции с DOM, как правило, являются неправильным подходом в Meteor. Я не уверен, как сравнивается производительность.

Комментарии:

1. Спасибо, я думал о том, чтобы сделать что-то подобное, и я думаю, что это чище. Я попробую!