2011-12-21 55 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