Meteor `Deps.autorun` vs` Collection.observe`
Каковы плюсы и минусы между использованием Deps.autorun
или Collection.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
, который будет выглядеть примерно так: (untested)
Deps.autorun(function() {
jsonData = FileTree.find().fetch();
$.jstree.reference('#fileTree')({'core': {'data': jsonData} });
});
Это просто пример. Я прошу про плюсы и минусы вообще, а не для этого конкретного случая использования.
Ответы
Ответ 1
Deps.autorun, теперь Tracker.autorun - реактивный вычислительный блок. Принимая во внимание, что watchChanges обеспечивает обратный вызов, когда что-то меняется.
Когда вы используете Deps.autorun, весь блок в function() {...}
, будет повторно запускаться каждый раз, когда реактивная переменная или документ изменяется вообще (обновляется, удаляется или вставляется) или любой другой изменение реактивной переменной.
Обратные вызовы watchChanges более точно настроены и запускают обратные вызовы для добавления, изменения или удаления в зависимости от запроса.
Основываясь на вашем коде выше, по сути оба одинаковы. Если у вас было больше реактивных переменных в блоке Deps.autorun, способ observeChanges
сделать это был бы более эффективным.
В общем, первый стиль более эффективен, но по мере того, как ваш код стоит выше, они почти одинаковы и зависят от ваших предпочтений.