我可能错过了一些非常愚蠢的东西,(Ember newbie)但我无法弄清楚如何修改一个在我的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似乎可以工作。
答案 0 :(得分: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设置为控制器的content属性。您会注意到,如果处理数组,许多教程都会利用此控制器。
App.ItemListController = Ember.ArrayController.extend({
content : null, //set your itemList into this property
clickHandler:function(e){
this.get("content").setEach("desc", "CANCELLED");
}
});