2015-02-19 11 views
6

Ho un modello di meteorologia che esegue il rendering di un codice HTML di cui ho bisogno per eseguire una funzione jQuery. Al momento, ho impostato una dipendenza in modo che ogni volta che i dati (un elenco di oggetti) legati a quel modello cambiano, la funzione viene eseguita. Non sono affatto sicuro che questo sia il modo migliore per fare ciò che sto cercando di fare, ma esegue la funzione ogni volta che aggiungo/elimina/riorganizzo gli oggetti, quindi è un inizio.Esecuzione di una funzione DOPO che un modello di meteore viene aggiornato

Tuttavia, la funzione sembra essere in esecuzione prima che il modello venga nuovamente sottoposto a rendering, quindi il set precedente di blocchi viene convertito in jquery, ma i blocchi che ho appena aggiunto a tale azione non lo fanno.

C'è un modo per forzare una funzione per eseguire DOPO che un modello è reso/aggiornato? Ogni aiuto è molto apprezzato!

(domanda simile qui - Meteor reactive jquery - ma non ha alcuna risposta)

Ecco alcuni bit del codice forse rilevanti:

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

(Perché le autorun nel mio modello .rendered thing? Non è sicuro.Questo è sembrato un buon punto per dirlo, ma questa è la mia prima volta che mi occupo davvero delle dipendenze, quindi potrei essere totalmente fuori base qui. Qualsiasi idea su ciò che sta andando storto sarebbe eccellente.)

risposta

5

È possibile utilizzare Tracker.afterFlush per questo (e Tracker è un nuovo nome per 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() 

Tuttavia, il modo Meteor è qualcosa di più simile a questo:

<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

Funziona in usi una ReactiveVar. – SsouLlesS

1

Ho trovato qualcosa che funziona, ma sembra ancora un po 'hacky ...

Quello che ho finito è impostare un timeout. Così ora, al posto del codice di cui sopra, ho:

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

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

Finora, questo è stato il tempo sufficiente per il modello di rendere/aggiornamento, in modo che il JQuery funziona con tutti i dati più recenti. Ancora speranzoso per una soluzione più elegante, ma questo lo farà!

Problemi correlati