2011-12-21 79 views
35

有沒有辦法輕鬆克隆骨幹集合?我想知道爲什麼沒有像模型一樣構建方法。我的問題是,我有一個模型拿着孩子的集合。當我克隆模型。我仍然收集孩子,但只有他們的默認值。如何克隆主幹集合

回答

13

你想要克隆該集合的用例是什麼?

集合中沒有內置的克隆功能,因爲您不想克隆集合中的模型。克隆一個模型會導致同一個模型有兩個單獨的實例,如果你更新了一個模型,另一個將不會被更新。

如果您想基於特定條件創建新集合,那麼您可以使用該集合的過濾方法。

var freshmenModels = studentsCollection.filter(function(student) { 
    return student.get('Year') === 'Freshman'; 
} 

var freshmenCollection = new Backbone.Collection(freshmenModels); 

要繼續前進,克隆集合中的模型,你可以寫下面的代碼

var clonedCollection = new Backbone.Collection(); 
studentsCollection.each(function(studentModel) { 
    clonedCollection.add(new Backbone.Model(studentModel.toJSON())); 
}); 
+1

但我想複製所有單一車型的收藏。 – 2011-12-21 22:30:33

+0

你想要做什麼,你需要複製/克隆集合中的所有模型? – Paul 2011-12-22 00:20:44

+0

我有一堆產品,可以有一個子產品列表。所以當有些人把他們放在籃子裏時,我必須複製所有的副產品。用戶可以更改產品本身和子產品的數量。所以我需要一份原件在籃子裏。 – 2011-12-22 08:07:38

4

另一種選擇,如果你需要以下(這是我一直在尋找,當我發現這個問題;)):

  • 集合的副本應該是相同類型與原始採集的(例如,你已經創建了一個擴展Backbone.Collection自己的集合型)
  • 集合的副本應與相同的選項集合的副本原
  • 的模型來創建應使用model.clone()方法創建

代碼:

var models = original.map(function (model) { return model.clone(); });  
var options = _.clone(original.options);  
var copy = new original.constructor(models, options); 

Backbone.Collection上的泛型克隆方法會很棘手,因爲模型及其嵌套對象是否通過引用被複制或者自身被克隆總是存在細微之處。根據你的情況,需求會有很大的變化,所以你只需要寫出你需要的東西。

59

最簡單的方法:

var cloned = new Backbone.Collection(original.toJSON()); 

其中original是克隆的集合。

總是可以擴展Backbone的Collection以添加克隆支持w或w/o繼承支持。

+2

這是一個很好的答案,因爲它會執行深度克隆,這意味着它也會克隆模型。如果您更喜歡淺色克隆,其中新集合將指向相同的模型實例,請使用下面的Craig Myles的答案。 – Dre 2015-09-10 23:21:35

+0

模型具有方法時不適用 – OlehZiniak 2018-01-31 14:42:44

7

使用Backbone Collection clone()方法:

var clonedCollection = myCollection.clone(); 
+1

它克隆集合的鏈接,因此myCollection中的更改將遵循clonedCollection中的更改 – 2015-02-24 14:14:37