2013-05-20 21 views
1

我在灰烬的对象(姑且称之为existing):Ember.js如何Concat的两个对象

var existing = { 
    items: [ 
     ... 
    ], 
    ... 
} 

在创下了服务器端请求的回调,有一个叫result新的响应看起来与existing相同。我需要现有的items,并将它们添加到新的result。所以,我有以下几点:

var result = { ... }; 
    var existing = this.get('content'); 
    result.items = result.items.concat(existing.items); 
    this.set('content', result); 

问题是,在模板渲染时,它只是从result显示新的项目,都没有,即使是在items显示从existing的旧项目。任何想法为什么?

谢谢。

+1

我认为这是因为ember已经拥有父数组对象上的绑定,并且当您调用concat时,实际上是在JavaScript中返回一个新的数组对象 - 并且它没有任何与它关联的Embers绑定。 – Adam

回答

2

我想问题是,使用(http://emberjs.com/api/classes/Ember.Array.html)不支持的concat不会触发绑定,因此您的视图不会更新。为了让项目阵列合并,你可以这样做:

var result = { ... }; 
var existing = this.get('content'); 
result.items.forEach(item) { 
    existing.items.pushObject(item); 
} 
this.set('content', existing); 

希望它可以帮助

0

如果result.items是一个数组,你想使用的JavaScript concat方法可以调用指定者现有。项目可枚举。

var result = { ... }; 
var existing = this.get('content'); 
result.items = result.items.concat(existing.get('items').toArray()); 
this.set('content', result); 

如果result.items已经是Ember.Enumerable,我会使用pushObjects或addObjects。 http://emberjs.com/api/classes/Ember.MutableArray.html#method_addObjects

var result = { ... }; 
var existing = this.get('content.items'); 
result.items = result.get('items').addObjects(existing); 
this.set('content', result); 
0

我看到这是一个老帖子,但由于没有一个公认的答案,我想我会在我的感觉是最好的选择抛出。我最近发现自己需要Concat的一堆DS.ManyArray在一起,这是解决方案,我想出了瓦特/:

var myArrayOfHasManyArrays = ...; 
var concatenated = [].concat.apply([], myArrayOfHasManyArrays.invoke('toArray')); 

希望这有助于!