2014-10-09 15 views
9

Sono costretto ad assegnare i callback resi a tutti i miei modelli.Render callback a tutti i modelli in meteor fiammata

Fino 0.9.0 ho usato per fare in questo modo:

_.each(Template, function(template, name) { 
    //... 
    template.rendered = function() { 
    //... 
    }; 
}); 

Ma ora, è un modello di costruzione e non un oggetto, quindi questo metodo non funziona qui. C'è un modo per passare la funzione di callback a tutti i template o la funzione di fuoco quando tutti i template sono stati renderizzati usando Blaze?

risposta

9

Ecco una rapida soluzione che ho trovato, iterando su ogni proprietà Template per scoprire se corrisponde a una definizione del modello e, in caso affermativo, assegnare il callback onRendered.

// make sure this code is executed after all your templates have been defined 
Meteor.startup(function(){ 
    for(var property in Template){ 
    // check if the property is actually a blaze template 
    if(Blaze.isTemplate(Template[property])){ 
     var template=Template[property]; 
     // assign the template an onRendered callback who simply prints the view name 
     template.onRendered(function(){ 
     console.log(this.view.name); 
     }); 
    } 
    } 
}); 

Non so qual è il tuo caso d'uso quindi ci possono essere soluzioni migliori a seconda di esso.

+1

In realtà è ciò di cui ho bisogno, ma qualche idea su dove inserire questo codice in modo che si carichi dopo che tutti i modelli sono stati definiti? E invece di controllare 'Template [proprietà] .viewName' si può usare la funzione Blaze.isTemplate –

+1

Grazie per il suggerimento' Blaze.isTemplate', ho aggiornato il mio codice per usare un 'Meteor.startup 'lato client per assicurarmi che sia eseguito dopo che tutti i modelli sono stati definiti. – saimeunt

+0

Funziona come un fascino! Grazie tante! –

-4

Con Meteor 1.2.1 l'oggetto Modello ha una funzione onRendered (hook) per eseguire un comportamento 'tutto il modello' sul comportamento Rattenuto.

Template.onRendered(function(){ 
    var template = this; 
    Deps.afterFlush(function() { 
    console.log("triggering Jquery mobile component creation for "+template.view.name); 
    $(template.firstNode.parentElement).trigger("create"); 
    }); 
}); 

L'aggiornamento posticipato tramite Deps.afterFlush (callback) è facoltativo e soggetto alle vostre esigenze applicative.

+2

Sono su Meteor 1.2.1 ma questa soluzione non funziona: 'TypeError: Template.onRendered non è una funzione' –

+0

Non so perché questo non ha funzionato per te e apparentemente altri che hanno votato la risposta, ma questo la funzionalità funziona come previsto per me in diverse applicazioni di produzione. Controlla il [codice sorgente] (https://github.com/meteor/blaze/commit/1d175814f1d9ad857743601f55073395dbdfedad) e se possibile conferma che il tuo oggetto Template è in realtà un oggetto Meteor Blaze Template e non sostituito/mutato ... – user1756588

+0

Appena controllato su Meteor 1.4 e 'Template.onRendered' sono' indefiniti'. –

Problemi correlati