[英]Ember.js: How do I determine if a property has really changed in an Observer?
[英]Ember.js: How do I prevent this property observer from being hit more than once?
在我的控制器中,我有一个属性和一个观察该属性的函数。 当属性更改一次时,观察者将被击中3次-用旧数据两次,用新数据一次。 您可以在刚刚创建的jsbin的控制台窗口中看到它的发生:
用法:单击其中一本书(不是第一本书),然后在控制台窗口中查看结果。
在我的实际应用中,要执行的工作需要异步下载。 由于三击,该观察者两次下载了错误的内容,一次下载了正确的内容。 使这个问题更加明显的是异步响应不会按顺序返回。 :)
临时解决方案是安排下载代码在以后运行。
我不确定为什么会这样,但是指南提供了一种解决方法。 他们建议如下:
bookObserver: function() {
Ember.run.once(this, 'bookWasChanged');
}.observes('book'),
bookWasChanged: function() {
// This will only run once per run loop
}
就我个人而言,我总是假设观察者即使在我不希望他们射击的情况下也可以解雇。 例如,使用此代码,我将执行以下操作:
bookObserver: function() {
var book = this.get('book');
var lastBook = this.get('lastBook');
if (book !== lastBook) {
this.set('lastBook', book);
doSomethingWithBook(book);
}
}.observes('book')
这样,即使Ember打电话给您的观察员1000次,您也只会在书实际更改时去做您想要的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.