2015-02-19 3 views
6

У меня есть метеорный шаблон, отображающий некоторый html, который мне нужен для выполнения функции jquery. Прямо сейчас, я настроил зависимость, так что каждый раз, когда данные (список объектов), привязанные к этому шаблону, изменяются, функция запускается. Я совсем не уверен, что это лучший способ сделать то, что я пытаюсь сделать, но он запускает функцию каждый раз, когда я добавляю/удаляю/переупорядочиваю объекты, так что это начало.Запуск функции ПОСЛЕ обновления шаблона метеора

Как бы то ни было, функция работает до того, как шаблон будет повторно отображен, поэтому предыдущий набор блоков получит jquery-fied, но любые блоки, которые я только что добавил на это действие, не работают.

Есть ли способ заставить функцию запускать ПОСЛЕ того, как шаблон визуализируется/обновляется? Любая помощь высоко ценится!

(подобный вопрос здесь - Meteor reactive jquery - но он не имеет никаких ответов)

Вот некоторые, возможно, соответствующие биты кода:

Template.showPictures.rendered = 
    Deps.autorun() -> 
     album = Albums.findOne(Session.get("selectedAlbum")) 

     if (album) 
     pictures = album.orderedPictures() 
     MyApp.loadJQuery() 

Template.showPictures.helpers 
    pics: -> 
    MyApp.myDependency.depend() 

    album = Albums.findOne(Session.get("selectedAlbum")) 
    album.orderedPictures() 

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

ответ

5

Вы можете использовать Tracker.afterFlush для этого (и Tracker это новое название для Deps):

Template.showPictures.rendered = 
    Tracker.autorun() -> 
     album = Albums.findOne(Session.get("selectedAlbum")) 

     if (album) 
     Tracker.afterFlush -> 
      // This will get executed when (among other things) 
      // the UI has been updated. 
      pictures = album.orderedPictures() 
      MyApp.loadJQuery() 

Однако путь метеора нечто большее, как это:

<template name="things"> 
    {{#each things}} 
     {{> thing}} 
    {{/each}} 
</template> 

<template name="thing"> 
    <!-- Show the thing here... --> 
</template> 
Template.things.helpers({ 
    things: function(){ 
     return Things.find() 
    } 
}) 

Template.thing.rendered = function(){ 
    // This get executed each time a new thing is rendered! 
} 
+0

Работает в вы используете ReactiveVar. – SsouLlesS

1

Я нашел что-то, что работает, но все еще кажется вроде хаки ...

То, что я закончил, это установить тайм-аут. Так что теперь, вместо кода выше, у меня есть:

Template.sitePreview.rendered =() -> 
    Deps.autorun() -> 
    album = Albums.findOne(Session.get("selectedAlbum")) 

    if (album) 
     pictures = album.orderedPictures() 
     setTimeout MyApp.loadJQuery, 500 

До сих пор, что было достаточно времени для шаблона для отображения/обновления, поэтому JQuery работает на всех самых последних данных. Все еще надеемся на более элегантное решение, но это будет сделано!

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