如何克隆骨干集合

时间:2011-12-21 22:03:48

标签: backbone.js

有没有办法轻松克隆Backbone Collection?我想知道为什么没有类似模型的方法构建。我的问题是我有一个模型,里面有一群孩子。当我克隆模型时。我仍然是孩子的集合,但只有他们的默认值。

4 个答案:

答案 0 :(得分:60)

最简单的方法:

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

其中original是要克隆的集合。

总是可以随后扩展Backbone的Collection以添加克隆支持w或w / o继承支持。

答案 1 :(得分:14)

您想要克隆集合的用例是什么?

集合没有内置克隆功能,因为您不想克隆集合中的模型。克隆模型会导致同一模型有两个独立的实例,如果更新一个模型,另一个模型将不会更新。

如果要根据特定条件创建新集合,则可以使用集合的过滤方法。

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()));
});

答案 2 :(得分:8)

使用Backbone Collection clone()方法:

var clonedCollection = myCollection.clone();

答案 3 :(得分: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上的通用克隆方法会很尴尬,因为模型及其嵌套对象是通过引用复制还是自己克隆,总会有细微之处。根据您的情况,要求会有很大差异,因此您可以根据自己的需要编写要求。