0

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

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

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

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

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

我怎样才能做到这一点?

4

1 回答 1

1

嗯,myProperty没有反应。定义它的对象是。
如果您想保持良好的反应性,那么您可以使用 aReactiveVar来存储 的值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()
)
于 2015-10-22T20:31:43.133 回答