流星`Deps.autorun`对`Collection.observe`

时间:2014-09-23 15:43:51

标签: json mongodb meteor jstree reactive-programming

使用Deps.autorunCollection.observe使第三方窗口小部件与被动Meteor.Collection同步之间的优缺点是什么。

例如,我正在使用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();
  }
});

使用此方法与Deps.autorun调用相比,有什么优点/缺点:(未经测试)

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

这只是一个例子。我一般都在询问一般的利弊,而不是这个具体的用例。

1 个答案:

答案 0 :(得分:26)

Deps.autorun,现在Tracker.autorun是一个反应计算块。而observeChanges提供了回调时的回调。

当您使用Deps.autorun时,function() {...}中的整个块将在每次反应变量或文档发生变化时以任何方式重新运行(更新,删除或插入),或者任何其他反应变量。

observeChanges回调更精细,并根据查询触发添加,更改或删除的回调。

根据您的上述代码,实际上两者都是相同的。如果你在Deps.autorun块中有更多的反应变量,那么observeChanges这样做的方式会更有效。

一般来说,第一种风格效率更高,但是当你的代码高于它们时,它们几乎都是相同的,这取决于你的偏好。