仅当活动文档的特定字段发生更改时,如何运行跟踪器计算?

时间:2015-10-22 17:11:16

标签: javascript meteor reactive-programming meteor-tracker

我正在使用Tracker.autorun在更改集合文档时调用Meteor应用程序中的函数。 Tracker正在运行,但我只希望它在文档的特定属性发生更改时运行:

Tracker.autorun(() => {
  let _x = Site.MyCollection.findOne(this._id).myProperty;

  if (_x) {
    this._myMethod(_x);
  }
});

我只希望计算在'myProperty'的值发生变化时失效,但只要更新集合的任何属性就会调用它。

在这种情况下,我无法使用Session变量,因为myProperty的值可以由另一个连接的客户端更新。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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()
)