Ember.js:如何防止此属性观察者被多次击中?

时间:2014-09-18 08:36:26

标签: ember.js ember-data

在我的控制器中,我有一个属性和一个观察该属性的函数。当属性改变一次时,观察者被击中三次 - 使用旧数据两次,使用新数据一次。您可以在我刚刚创建的jsbin的控制台窗口中看到它:

jsbin

用法:单击其中一本书(不是第一本书),然后在结果中查看控制台窗口。

在我的实际应用中,要执行的工作需要异步下载。由于三次点击,该观察者正在下载错误的内容两次和正确的内容。使这个问题更加明显的是异步响应不会按顺序返回。 :)

临时解决方案是安排下载代码稍后运行。

1 个答案:

答案 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次电话,你也只会在书本实际变化时做你想做的工作。