6

我一直在为 Ember 开发 Todo MVC 应用程序Ember.run.once在模型中,我注意到对包含在See中的 commit() 方法的调用: https ://github.com/addyosmani/todomvc/blob/gh-pages/architecture-examples/emberjs/js/models/todo.js# L9

todoDidChange: function () {
    Ember.run.once(this, function () {
        this.get('store').commit();
    });
}.observes('isCompleted', 'title');

this.get('store').commit()包裹如何Ember.run.once帮助?我将方法更改为:

todoDidChange: function () {
    this.get('store').commit();
}.observes('isCompleted', 'title');

但我没有看到任何明显的区别。我阅读了文档,并且之前的SO 讨论无法弄清楚。

这是因为它只是一个小应用程序而没有显示差异的情况吗?

4

1 回答 1

5

我找到了答案作为对另一个问题的回应

如果您对数组的每个项目都有一个侦听器,如下所示:

App.IssuesController = Ember.ArrayController.extend({ 
    issue_list: ['a','b','c'],
    issueListObserver : function(){
        Ember.run.once(this, this.categorize);
    }.observes('issue_list.@each"),

    this.categorize: function () {
        console.log('foo');
    }
});

没有Ember.run.once,this.categorize()将为列表中操作的每个项目调用。如果修改了三个项目,那么将有三个调用。使用 categorize 包裹Ember.run.once,它只会在链的末尾被调用一次。

于 2013-04-03T07:27:39.643 回答