我正在学习Ember.js并浏览一些指南。我正在阅读有关观察员的信息: http://emberjs.com/guides/object-model/observers/
我想玩这个例子,所以我将其复制并粘贴到我的js文件中。在向观察者回调添加警告语句后,我惊讶地发现它没有被调用。
http://jsbin.com/UWEseSo/2/edit?js,output
我能够找到,如果你添加:
person.get('fullName');
在调用firstName之前,将调用观察者回调。如果在再次不再调用回调之后立即再次设置第一个名称。
有谁能解释这里发生了什么?
谢谢。
EDIT -------
我已经对代码进行了更多跟踪,现在我已经了解了为什么这种行为可能是这样的。虽然这个例子似乎有一个bug,但它可能只是一个优化。我之前观察到,如果我打电话给“获取”,观察者就会工作。如果我没有打电话给“获取”,观察者将无法工作。我相信Ember.js可能只是对此很聪明,如果没有调用“get”,故意不打扰调用观察者。他们可能这样做是因为如果没有“get”,就没有理由调用观察者,因为应用程序不可能显示过时的信息。
一旦调用了“get”,就会设置一个内部标志,以确保在下一个“set”上调用观察者。
答案 0 :(得分:15)
看起来你自己完全了解了这种行为的解释,并且为了确认你的假设,主要是因为性能原因而在rc8中引入了一个变化。
您可以阅读here关于该文章的完整文章,未经审核的计算属性不要触发观察者
这基本上意味着如果您需要观察计算属性但当前没有检索它,只需在get
方法中init
。
希望它有所帮助。