Javascript 如何在可能还不存在的被动对象字段上创建被动依赖关系?

Javascript 如何在可能还不存在的被动对象字段上创建被动依赖关系?,javascript,meteor,meteor-tracker,Javascript,Meteor,Meteor Tracker,如果一个物体具有良好的反应性 var obj = { foo : new ReactiveVar(0), bar : new ReactiveVar(0) }; 我可以通过跟踪器计算轻松地对这些字段作出反应: Tracker.autorun(function logObj() { console.log('obj.foo is:', obj.foo.get()); console.log('obj.bar is:', obj.bar.get()); }); 但是,如果我知道在

如果一个物体具有良好的反应性

var obj = {
  foo : new ReactiveVar(0),
  bar : new ReactiveVar(0)
};
我可以通过跟踪器计算轻松地对这些字段作出反应:

Tracker.autorun(function logObj() {
  console.log('obj.foo is:', obj.foo.get());
  console.log('obj.bar is:', obj.bar.get());
});
但是,如果我知道在以后的某个日期将要定义对象baz,并且我还想在定义后尽快对其作出反应,我不能这样做:

Tracker.autorun(function logObj() {
  console.log('obj.foo is:', obj.foo.get());
  console.log('obj.bar is:', obj.bar.get());
  if(obj.hasOwnProperty('baz')) console.log('obj.baz is:', obj.baz.get());
});
这是因为如果它在未定义
obj.baz
的情况下运行,则不会在其上添加依赖项,因此,如果它出现或更改,也不会重新运行。对
obj.baz
作出反应的唯一方法是,如果
foo
bar
在定义
baz
时使计算无效,从而调用
.get()
并创建依赖项


如何对尚未定义的对象字段的创建作出反应?我希望答案在ES5中,但我对ES6或ES7没有意见。

我们在创建组件时遇到了相同的问题-我们找到的唯一解决方案是创建一个包装器,在第一次读取时定义反应状态。这似乎与您问题的最后一段冲突,因此我不确定这是否是一个可接受的答案。您能否创建一个包含baz类型的影子反应变量,并对从未定义类型更改为其他类型的情况做出反应?使用
ReactiveDict
有什么问题?进一步思考,为什么不让整个对象成为一个被动的var,而不是其中的键呢。然后可以对整个对象的任何更改做出反应,而不仅仅是关键帧。实际上是javascript阻止了你对obj.baz的反应,因为你不能将反应函数(*dep和equalsFunc)附加到一个还不存在的键上。最后,当你创建obj(如果它还不存在的话)时,难道你不能在中初始化obj.baz,并让它在其他地方定义时更改吗?@MichelFloyd啊,这是有原因的,尽管这不在问题中。我可能希望依赖于字段的一个子集,而不是同时依赖于所有字段。例如,只观察
foo
,或者只观察
bar
和一个不存在的
name
…我们在创建组件时遇到了相同的问题-我们找到的唯一解决方案是创建一个包装器,在第一次读取时定义反应状态。这似乎与您问题的最后一段冲突,因此我不确定这是否是一个可接受的答案。您能否创建一个包含baz类型的影子反应变量,并对从未定义类型更改为其他类型的情况做出反应?使用
ReactiveDict
有什么问题?进一步思考,为什么不让整个对象成为一个被动的var,而不是其中的键呢。然后可以对整个对象的任何更改做出反应,而不仅仅是关键帧。实际上是javascript阻止了你对obj.baz的反应,因为你不能将反应函数(*dep和equalsFunc)附加到一个还不存在的键上。最后,当你创建obj(如果它还不存在的话)时,难道你不能在中初始化obj.baz,并让它在其他地方定义时更改吗?@MichelFloyd啊,这是有原因的,尽管这不在问题中。我可能希望依赖于字段的一个子集,而不是同时依赖于所有字段。例如,只观察
foo
,或只观察
bar
和不存在的
名称
。。。