2015-02-19 28 views
6

Mam szablon meteor renderowania niektórych html, które trzeba wykonać na jquery funkcja. W tej chwili skonfigurowałem zależność, aby za każdym razem, gdy dane (lista obiektów) związana z tym szablonem uległa zmianie, funkcja działała. Wcale nie jestem pewien, czy to jest najlepszy sposób, aby zrobić to, co próbuję zrobić, ale uruchamia tę funkcję za każdym razem, gdy dodaję/usuwam/zmieniam kolejność obiektów, więc to jest początek.Uruchamianie funkcji PO szablon meteorów jest aktualizowany

Jednak, funkcja wydaje się być uruchomiony przed szablon jest re-renderowane, więc poprzedni zestaw klocków uzyskać jquery-fied, ale wszelkie bloki Właśnie dodałem tego działania nie.

Czy istnieje sposób na wymuszenie działania funkcji PO renderowaniu/aktualizacji szablonu? Każda pomoc jest doceniana!

(podobne pytanie tutaj - Meteor reactive jquery - ale nie ma żadnych odpowiedzi)

Oto kilka istotnych bitów może-kod:

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() 

(Dlaczego autorun w swoim szablonie Nie jestem pewien ... To wydawało się być dobrym miejscem na to, ale jest to mój pierwszy raz, kiedy naprawdę mam do czynienia z zależnościami, więc mogłem być całkowicie nieobecny tutaj. Wszelkie pomysły na temat tego, co dzieje się nie tak, byłyby doskonałe.

Odpowiedz

5

Można użyć Tracker.afterFlush za to (i Tracker to nowa nazwa dla 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() 

Jednak sposób Meteor jest czymś więcej tak:

<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

Działa w używasz ReactiveVar. – SsouLlesS

1

Znalazłem coś, co działa, ale nadal wydaje się dość hacky ...

Co ja w końcu robię to ustawienie limitu czasu. Więc teraz, zamiast powyższego kodu, mam:

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

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

tak daleko, że upłynęło wystarczająco dużo czasu dla szablonu do renderowania/aktualizację, więc JQuery działa na wszystkich najnowszych danych. Nadal mam nadzieję na bardziej eleganckie rozwiązanie, ale to zrobi!

Powiązane problemy