Запустите JS после рендеринга шаблона метеора

У меня есть шаблон, который выглядит примерно так:

<template name="foo">
  <textarea name="text">{{contents}}</textarea>
</template>

Я рендеринг это с:

Template.foo = function() {
  return Foos.find();
}

И у меня есть несколько обработчиков событий:

Template.foo.events = {
  'blur textarea': blurHandler
}

Что я хочу сделать, это установитьrows атрибутtextarea в зависимости от размера его содержимого. Я понимаю, что могу написать помощника Handlebars, но у него не будет доступа к отображаемому элементу DOM, что заставит меня сделать ненужное дублирование. В идеале я хочу, чтобы метеор вызывал событие после рендеринга элемента. Что-то вроде:

Template.foo.events = {
  'render textarea': sizeTextarea
}

Это возможно?

 Trevor Burnham14 июн. 2012 г., 02:43
возможный дубликатCallback after the DOM was updated in Meteor.js

Ответы на вопрос(4)

Начиная с Meteor 0.4.0, можно проверить, закончил ли шаблон рендеринг, см.http://docs.meteor.com/#template_rendered

Если я правильно понимаю ваш вопрос, вам следует заключить код изменения размера textarea в функцию Template.foo.onRendered:

Template.foo.onRendered(function () {
  this.attach_textarea();
})

Примерно с июня 2014 года правильный способ сделать это установить обратный вызов, используяTemplate.myTemplate.onRendered () .

 17 июл. 2015 г., 18:52
Он не срабатывает КАЖДЫЙ раз, только один раз.
Решение Вопроса

что текущие "лучшие" способ сделать это (это немного взломать), это использоватьMeteor.defer алаОбратный вызов после обновления DOM в Meteor.js.

Джефф - один из разработчиков метеоров, поэтому его слово - Евангелие :)

Так что в вашем случае вы можете сделать что-то вроде:

 <textarea id="{{attach_textarea}}">....</textarea>

а также

 Template.foo.attach_textarea = function() {
   if (!this.uuid) this.uuid = Meteor.uuid();

   Meteor.defer(function() {
     $('#' + this.uuid).whatever();
   });

   return this.uuid;
 }

EDIT

Обратите внимание, что, начиная с версии 0.4.0, вы можете сделать это очень быстро (как указал Сандер):

Template.foo.rendered = function() {
  $(this.find('textarea')).whatever();
}
 14 июн. 2012 г., 02:45
@TrevorBurnham: да, (хорошо Meteor.setTimeout, см. Документы). Таким образом, вы хотите, чтобы что-то запускалось после присоединения узлов DOM, но до того, как узлы отображаются в браузере; перед тем как поток рендеринга возвращается? AFAIK нет никакого способа подключиться к этому, извините.
 Trevor Burnham14 июн. 2012 г., 02:40
Хм,Meteor.defer это просто обертка вокругsetTimeout(..., 0), право? Такой подход пришёл ко мне, но он мог вызвать видимое мерцание. Мне действительно нужен хэнд пост-рендера, который предшествует циклу событий.
 14 июн. 2012 г., 02:29
Чтобы убедиться, что я понимаю - здесь нет ничего волшебного в том, что здесь есть динамический идентификатор, просто что эта функция будет вызываться каждый раз при рендеринге элемента? То есть Вы могли бы сделать это с атрибутом данных или что-то еще?
 Trevor Burnham14 июн. 2012 г., 02:42
Сказав это, я собираюсь принять этот ответ, потому что мой вопрос является дубликатом того, с которым вы связаны (хотя принятый ответ на этот вопрос далек от идеального).
 14 июн. 2012 г., 02:43
@ 7zark7: Динамический идентификатор уже есть, поэтому вы можете найти соответствующий элемент в вызове Defer. Вам решать, как это сделать, используяMeteor.uuid это просто предложение.

Да, я так думаю - не уверен, правильно ли это, но это работает для меня:

В вашем приложении JS клиентская секция будет запускать на клиенте любой javascript. Например:

if (Meteor.is_client) {
    $(function() {
        $('textarea').attr('rows' , 12) // or whatever you need to do
    })
    ...

Обратите внимание, что в данном примере используется JQuery, и в этом случае вам необходимо предоставить это клиенту (я думаю :-). В моем случае:

Я создал каталог / client и добавил файл jquery.js под этим.

Надеюсь это поможет.

 22 июл. 2012 г., 15:43
Кроме того, не включен ли jQuery в Meteor? У меня нет нигде файла jquery.js, и я не добавил никакого специального пакета jQuery, но я могу прекрасно использовать jQuery в моих приложениях Meteor.
 14 июн. 2012 г., 02:26
Ах да, спасибо
 14 июн. 2012 г., 02:10
Проблема состоит в том, что, хотя это может сработать на начальном этапе прорисовки, оно может столкнуться с проблемами, если элемент когда-либо реактивно перерисовывается.
 18 авг. 2012 г., 05:04
Мне пришлось «добавить метеор». IIRC

Ваш ответ на вопрос