2014-09-23 36 views
22

使用Deps.autorunCollection.observe保持第三方小工具與反應Meteor.Collection同步之間有什麼優點/缺點。流星`Deps.autorun` vs`Collection.observe`

例如,我使用jsTree以可視方式顯示我存儲在MongoDB中的目錄樹。我使用這個代碼,使其反應:

// 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(); 
    } 
}); 

什麼是使用這種方法VS一個Deps.autorun電話會看起來像這樣的優點/缺點:(未經測試)

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

這只是一個例子。我一般會問利弊,而不是針對這個特定的用例。

回答

25

Deps.autorun,現在是Tracker.autorun是一個被動計算模塊。而observeChanges提供了一個回調,當有什麼改變時。

當使用Deps.autorun,在function() {...}整個塊,將重新運行,每次在所有的反應變量,或文檔的改變,以任何方式(即,更新,刪除或插入),或任何其它反應性可變的變化。

observeChanges回調函數更好地調整,並根據查詢觸發回調以添加,更改或刪除。

根據上面的代碼,實際上兩者是相同的。如果你在Deps.autorun塊中有更多的反應變量,那麼這樣做的方式會更有效率。

總的來說,第一種風格更有效率,但是當您的代碼位於上方時,它們幾乎相同,並且取決於您的偏好。

+1

換句話說,「Tracker.autorun」可以處理任何可以註冊依賴關係的東西,但是「observeChanges」是更具體的鉤子,只能用於mongo遊標。 – BonsaiOak 2014-12-24 15:41:16

+0

@BonsaiOak是的,Tracker.autorun是一個神奇的代表之一,它將重新運行整個方法上的每個依賴項更改註冊在它的方法和觀察更改是非常具體的javascriptey事件掛鉤到數據庫更改特定的查詢 – Akshat 2014-12-24 16:02:02