2017-01-19 6 views
1

Я пытаюсь сделать встроенные твиты в своем приложении. У меня есть коллекция mongo твитов Ids (tweetId). Я использую (document) _id как id в div, чтобы Twitter мог настроить целевой элемент для твита.Как получить помощник для ожидания создания элемента DOM? [meteor]

шаблона:

{{#each mongoCollectionOfTweetIds}} 
    <div id={{_id}}> 
    {{embeddedTweet}} 
    </div> 
{{/each}} 

В помощнике "embeddedTweet" я бегу:

targetElement = document.getElementById("#{this._id}") 
twttr.widgets.createTweet("#{this.tweetId}", targetElement) 

Я знаю this._id точен через console.log тестирования. Я также подтвердил, что поиск элемента dom выше заканчивается неопределенным.

Итак, кажется, что в контексте данных есть метеор, но я слишком быстро вызываю twttr (т. Е. До того, как элемент dom существует из getelementbyid)?

Задача состоит в том, что для каждого вызова twttr требуется уникальный идентификатор dom.

Надеясь, что здесь есть лучший образец.

ответ

0

вам нужно подождать, пока шаблон не будет отображаться, прежде чем вы сможете перейти к элементам DOM.

Template.Foo.onRendered(function() { 
}); 

Здесь вы можете запускать свои запросы, чтобы найти своих детей DOM и обратиться к API-интерфейсу twitter.

помощники могут работать несколько раз, пока данные обновляются, а шаблон - рендеринг, поэтому все, что делается в помощниках, должно быть идемпотентным. и в идеале не попадает в API.

+0

Я добавил console.log в onRendered и onCreated для тестирования, но кажется, что они запускаются только один раз. Я ожидал, что они будут запускаться для каждого элемента в коллекции через {{#each}}, но похоже, что dom обновлен, но шаблон не перерисовывается. В качестве второй попытки я перевел вызов twttr на метод на сервере, но, похоже, клиент является единственным, кто понимает эту библиотеку, поскольку я загружаю ее по сценарию в – ppedrazzi

+0

по умолчанию, onRendered() будет запускаться только один раз. если все элементы DOM отсутствуют, когда он запускается, вы можете заставить его запустить снова, добавив что-то реактивное внутри автозапуска(), например Template.currentData() или find() (то есть независимо от источника ваших данных твита является). – zim

+0

Спасибо zim. Будет играть с этим ... – ppedrazzi

 Смежные вопросы

  • Нет связанных вопросов^_^