2013-05-20 54 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')); 

希望這有助於!