5

我可能错过了一些非常愚蠢的东西,(Ember 新手)但我不知道如何修改在我的 Ember 控制器管理下的数组,而不是设置一个全新的数组。

例如。我的控制器中有以下测试功能。当用户单击时,我想用新值修改受控数组的每个元素(或者它可以是单个元素)。

我知道您应该通过“设置”来让 Ember 知道更改,所以我认为这会起作用:

clickHandler:function(e){
    var temp = this.get("itemList").copy(); // copy it
    for (var i = 0; i < temp.length; i++) { 
        temp[i].desc = "CANCELLED";     // change it
    }
    this.set('itemList', temp); // put it back
}

我制作了数组的副本,对其进行修改,然后将其重新设置。但不知何故,Ember 抱怨第 4 行,在那里我修改了 temp[i].desc 的内容,说我必须使用 Ember.Set。我以为我可以修改“离线”副本,然后将其重新设置,但不行,我不知道为什么。其他数组操作,如 shift/unshift/pop 似乎可以工作。

4

1 回答 1

12

你的方法看起来不太花哨。此代码将起作用:

clickHandler:function(e){
    var itemList = this.get("itemList");
    itemList.forEach(function(item){ // for iterating over an array, always use the forEach function
        item.set("desc", "CANCELLED"); // you have to call this set()-function to make changes to an Ember Object
    });
}

为什么需要调用 set() 方法而不能使用直接访问方法?

set() 方法使 Ember 能够执行其自动绑定魔法。调用此方法时,它会安排所有需要在依赖于修改后的属性的对象上执行的工作。最简单的示例是显示需要更新的给定属性的模板。

这里对上面的代码进行了可能的改进,使其更加修饰: 您可以使用 ArrayController 来管理您的 itemList。在这种情况下,您可以将 itemList 设置为控制器的内容属性。你会注意到很多教程在处理数组时都使用了这个控制器。

App.ItemListController = Ember.ArrayController.extend({
    content : null, //set your itemList into this property
    clickHandler:function(e){
        this.get("content").setEach("desc", "CANCELLED");
    }
});
于 2013-02-22T23:04:29.913 回答