在我的控制器中,我有一个属性和一个观察该属性的函数。当属性改变一次时,观察者被击中三次 - 使用旧数据两次,使用新数据一次。您可以在我刚刚创建的jsbin的控制台窗口中看到它:
用法:单击其中一本书(不是第一本书),然后在结果中查看控制台窗口。
在我的实际应用中,要执行的工作需要异步下载。由于三次点击,该观察者正在下载错误的内容两次和正确的内容。使这个问题更加明显的是异步响应不会按顺序返回。 :)
临时解决方案是安排下载代码稍后运行。
答案 0 :(得分:0)
我不确定为什么这种情况正在发生,但是the guides提供了解决问题的方法。他们建议这样的事情:
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次电话,你也只会在书本实际变化时做你想做的工作。