2014-09-23 8 views
22

Quali sono i pro/contro tra l'uso di Deps.autorun o Collection.observe per mantenere un widget di terze parti in sincrono con uno Meteor.Collection reattivo.Meteor `Deps.autorun` vs` Collection.observe`

Ad esempio, sto usando jsTree per visualizzare visivamente un albero di directory che ho memorizzato nel mio MongoDB. Sto usando questo codice per rendere più reattiva:

// automatically reload the fileTree if the data changes 
FileTree.find().observeChanges({ 
    added: function() { 
    $.jstree.reference('#fileTree').refresh(); 
    }, 
    changed: function() { 
    $.jstree.reference('#fileTree').refresh(); 
    }, 
    removed: function() { 
    $.jstree.reference('#fileTree').refresh(); 
    } 
}); 

Quali sono i vantaggi/svantaggi di questo metodo vs un Deps.autorun chiamata che sarebbe simile a questa: (non testati)

Deps.autorun(function() { 
    jsonData = FileTree.find().fetch(); 
    $.jstree.reference('#fileTree')({'core': {'data': jsonData} }); 
}); 

Questo è solo un esempio Sto chiedendo i pro/contro in generale, non per questo specifico caso d'uso.

risposta

25

Deps.autorun, ora Tracker.autorun è un blocco di calcolo reattivo. Mentre the observChanges fornisce un callback a quando qualcosa cambia.

Quando si utilizza Deps.autorun, l'intero blocco in function() {...} viene eseguito nuovamente ogni volta che una variabile reattiva o il documento viene modificato, in qualsiasi modo (aggiornato, rimosso o inserito) o qualsiasi altro reattivo cambiamento variabile.

I callback di observChanges sono più sintonizzati e attivano i callback aggiunti, modificati o rimossi a seconda della query.

In base al codice sopra riportato, in effetti entrambi sono uguali. Se avessi più variabili reattive nel blocco Deps.autorun, allora il modo di fare observeChanges sarebbe più efficiente.

In generale, il primo stile è più efficiente, ma poiché il codice è al di sopra, entrambi sono quasi uguali e dipendono dalle proprie preferenze.

+1

In altre parole, "Tracker.autorun" funziona con qualsiasi cosa possa registrare una dipendenza, ma "observChanges" sono hook più specifici che funzionano solo con i cursori di mongo. – BonsaiOak

+0

@BonsaiOak Sì, Tracker.autorun è il reps magico che eseguirà nuovamente l'intero metodo su ogni modifica delle dipendenze registrata nel suo metodo e osservaChanges sono hook di eventi javascriptey molto specifici alle modifiche del database a query specifiche – Akshat