Порядок отображения шаблона: родительские триггеры перед дочерними шаблонами

#javascript #jquery #meteor #meteor-blaze

#javascript #jquery #метеор #метеоритное пламя

Вопрос:

Я совсем новичок в Meteor, и у меня возникают проблемы при попытке понять «визуализированное» событие в шаблонах.

Предполагая, что у меня есть эти два шаблона:

 <template name="parent">    
    <div id="list">
        {{#each childs}}
            {{> child}}
        {{/each}}
    </div>
</template>

<template name="child">
    <div class="item">
        <!-- content -->
    </div>
</template>
  

и эти два события:

 Template.parent.rendered = function () {
    console.log('parent');
};

Template.child.rendered = function () {
    console.log('child');
};
  

Я всегда получаю это из консоли:

> родительский
> дочерний
> дочерний
> дочерний

Таким образом, в основном родительский шаблон запускает «визуализацию» до завершения визуализации внутренних шаблонов. Из-за этого я не могу выполнить какие-либо post-операции с DOM, такие как плагины jquery. например:

 Template.parent.rendered = function () {
    $('#list').myplugin();
};
  

Поскольку это выполняется до отображения внутренних шаблонов, это нарушает работу плагина.

Есть ли обходной путь или событие meteor, которое я могу безопасно использовать сейчас, когда шаблон полностью отрисован, включая его внутренние шаблоны?

Ответ №1:

Мой общий совет для подобных проблем заключается в том, что вам следует искать способ активировать ваш плагин после рендеринга каждого дочернего элемента, а не после рендеринга родительского — даже если это означает выполнение дополнительных вызовов плагина. Если вы можете это сделать, то это также решает связанную с этим проблему того, что происходит, когда несколько дочерних шаблонов добавляются некоторое время спустя (конечно, это может не относиться к вашему случаю).

Трудно дать точный ответ, не зная более подробной информации о том, что делает ваш плагин, но я могу привести пример из одного из моих приложений:

Я должен был убедиться, что все дочерние элементы были того же роста, что и самый высокий дочерний элемент. Моей первоначальной реакцией было то, что мне пришлось каким-то образом дождаться завершения рендеринга всех дочерних элементов, а затем один раз отрегулировать их высоту. Более простым решением было просто изменять размер всех из них каждый раз, когда какой-либо из них отображался. Конечно, это O (N ^ 2) сравнений, но это все равно быстро для небольшого списка и работает даже при добавлении новых дочерних шаблонов.


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

 Template.child.rendered = function () {
  if ($('.child').length === Children.find().count()) {
    $('#list').myplugin();
  }
};