我使用Tracker.autorun
在我的流星应用程序中调用一个函数,当一个集合文档被改变。跟踪器正在工作,但是我只希望它在文档的特定属性被更改时运行:
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()
)