Как запустить расчет Tracker, только если конкретное поле реактивного документа изменяется?
Я использую Tracker.autorun
вызвать функцию в моем приложении Meteor при изменении документа коллекции. Трекер работает, однако я хочу, чтобы он запускался только при изменении определенного свойства документа:
Tracker.autorun(() => {
let _x = Site.MyCollection.findOne(this._id).myProperty;
if (_x) {
this._myMethod(_x);
}
});
Я хочу, чтобы вычисление стало недействительным только при изменении значения myProperty, однако оно вызывается всякий раз, когда обновляется какое-либо свойство коллекции.
Я не могу использовать Session
переменные в этом случае, потому что значение myProperty
может быть обновлен другим подключенным клиентом.
Как мне этого добиться?
1 ответ
Что ж, myProperty
не реагирует Объект, по которому он определен, есть.
Если вы хотите сохранить хорошую реактивность, вы можете использовать ReactiveVar
хранить ценность myProperty
, а затем используйте вычисления, чтобы обновить его значение.
var myProperty = new ReactiveVar();
Tracker.autorun(function() {
//Reactivity kicks in with findOne
myProperty.set(
Site.MyCollection.findOne(this._id).myProperty
)
})
Затем вы можете запустить реактивные вычисления на myProperty
,
Обратите внимание, что в то время как вышеуказанные кодовые наборы myProperty
все время и, таким образом, может каждый раз вызывать реактивность, фактически игнорирует случаи, когда старое значение ===
на новое значение.
Если вы считаете это поведение нежелательным, вы можете принудительно аннулировать зарегистрированные зависимости:
//'_dependentsById' is an array-like object lacking an iterator, fallback on _
_.each(myProperty.dep._dependentsById,
(dep) => dep.invalidate()
)