2013-02-22 19 views
5

我可能错过了一些非常愚蠢的东西(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抱怨第四行,我修改了temp [i] .desc的内容,并说我必须使用Ember.Set。我认为我可以修改“离线”副本,然后将其设置回去,但是没有去,我也弄不明白为什么。其他阵列操作,如shift/unshift/pop似乎也可以工作。

回答

11

您的方法看起来不太复杂。此代码将工作:

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() - 方法使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"); 
    } 
}); 
+0

谢谢。你们花时间在Stack Overflow上教育我们是非常棒的。不幸的是,这些解决方案都不适合我。在这两种情况下,我都会收到错误“Uncaught TypeError:Object# has no method'set'”根据调试器,我回来的'item'看起来应该可以工作: item:Object __ember1361578135008_meta:Meta get desc:function(){ 获取名称:function(){ set desc:function(){ set name:function(){ __proto__:Object – 2013-02-23 00:12:30

+1

您的建议完全合理,我只是不明白为什么它不起作用。如果我使用ArrayController和行: this.get(“content”)。setEach('desc',“CANCELED”);然后我看到我的所有模板项目都重置为“CANCELED”,所以我知道其他一切正在工作,但是如果我使用“forEach”,则返回的“项目”将不会接受“设置”调用。 :^( – 2013-02-23 01:36:14

+0

)大约3个月前,当人们帮助我开始时,我也非常开心,你能把你的例子放到一个小提琴中吗?我会在几分钟后发布一个基本的余烬模板链接 – mavilein 2013-02-23 11:23:01

相关问题