Как запустить расчет 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()
)
Другие вопросы по тегам