2012-09-12 48 views
27

假設有2個集合,分別代表/api/page/1/api/page/2;無論如何(例如通過Underscore)將這2個集合合併爲一個新的單一集合?骨幹 - 合併2個收藏集?

回答

48

選項1

如果您還沒有獲取收集的是,你可以獲取第一個,然後取第二個與{補充:真}標誌,第二個會被合併到第一個:

collection.fetch({data : {page : 2}); 
=> [{id: 1, article : "..."}, {id: 2, article : "..."}]; 
collection.fetch({data : {page : 2}, add : true }); 
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, {id: 3, article : "..."}]; 

選項2

如果you'v Ë已經獲取的收藏,讓他們存儲在兩個變量,你可以添加第二個集合中的所有內容複製到第一個:

collection1.add(collection2.toJSON()); 

此選項遭受的事實,第一個集合將火「添加「事件時,第二個集合添加到它。如果有副作用,如不希望的UI重新呈現由於此事件,您可以通過添加{沉默:真正}壓制它標誌

collection1.add(collection2.toJSON(), {silent : true}); 

選項3

如果你只需要這些集合的JSON格式,即對於HTML模板渲染的目的,你可以減少一切JS文字(數組,對象):

collection1.toJSON().concat(collection2.toJSON()); 
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, ...]; 

選項4 =選項2 + 3

如果您已經取出兩個集合,你可以減少JS文字,並添加一切到一個新的骨幹收集

var rawCollection = collection1.toJSON().concat(collection2.toJSON()); 
var newCollection = new Backbone.Collection(rawCollection); 
+1

感謝您的詳細解釋=) – Kay

+12

-1。如果你打電話給JSON(),你會失去對模型的引用。如果您創建模型,請將其插入到集合中,將集合與另一個合併,更改模型,最後一個集合中的模型不會更新。這將成爲調試的噩夢。如果你想複製這些模型並保持它們分開,那就沒問題,但這不是標準,應該指出。 –

+9

如果你已經有了這兩個集合,你可能應該使用下面的任何一個答案:'collection1.add(collection2.models);' –

0

在我看來,通過這樣做,你失去了與/api/page/{1, 2}/綁定的語義。

在我看來,既不是骨幹,也不是下劃線,它提供了一個功能/方法來完成你想要做的事情。

所以你的選擇:

  • 創建一個新的集合,從以前的集合添加每個項目;
  • 第一收集項添加到第二個

但你可能已經知道這一點。

+0

是的。我認爲這裏的解決方案是有1個集合,你可以獲取({data:{page:1},add:true})''。每個'fetch()'增加頁面值,並將最新的一批/模型頁面添加到集合中。 – jmk2142

+0

您的解決方案看起來相當漂亮,但我認爲他已經取得了收藏集,並且可能希望避免重新獲取數據。但如果注意到這種情況,那麼你的方式就是一個好方法。 – ksol

5
collection.add(models, [options]) 

收藏是車型陣列

collection.models 

回報模型

陣列

的模型(或模型數組)添加到集合中。

A = Backbone.Collection; 
collection1 = new A([ 
    {key, 'value'},     //model1 
    {key : value1}     //model2 in collection1 
]); 

B = Backbone.Collection; 
collection2 = new B([ 
    {key1, 'value'},     //model1 
    {key1 : value1}     //model2 in collection2 
]); 


collection1.add(collection2.models); //now, collection1 has four models.. 
0

Collection.models提供moels和Collection.add的陣列直接訪問將採取的模式數組作爲參數。

5

使用

collection.models 

insted的的

collection.toJSON() 
41

試試這個, 收集的模型

collection1.add(collection2.models); 

如果我們使用數組

collection1.add(collection2.toJSON()); 

然後參考chage

+6

+1這是唯一真正的答案,應該是真正的答案。請參閱文檔:http://backbonejs.org/#Collection-add。您也可以通過傳遞以下內容來決定是否接受重複項:{merge:true} –