仅当反应文档的特定字段发生变化时,如何 运行 进行 Tracker 计算?

How to run a Tracker computation only if a specific field of a reactive document changes?

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

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

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

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

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

我怎样才能做到这一点?

嗯,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()
)