如何克隆骨干集合

And*_*rle 37 backbone.js

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

chi*_*chi 60

最简单的方法:

var cloned = new Backbone.Collection(original.toJSON());
Run Code Online (Sandbox Code Playgroud)

original要克隆的集合在哪里.

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

  • 这是一个很好的答案,因为它将执行深度克隆,这意味着它也将克隆模型.如果您更喜欢浅层克隆,其中新集合将指向相同的模型实例,请使用下面的Craig Myles的答案. (2认同)

Pau*_*aul 14

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

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

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

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

var freshmenCollection = new Backbone.Collection(freshmenModels);
Run Code Online (Sandbox Code Playgroud)

要继续并克隆集合中的模型,您可以编写以下代码

var clonedCollection = new Backbone.Collection();
studentsCollection.each(function(studentModel) {
  clonedCollection.add(new Backbone.Model(studentModel.toJSON()));
});
Run Code Online (Sandbox Code Playgroud)


Cra*_*les 8

使用Backbone Collection clone()方法:

var clonedCollection = myCollection.clone();
Run Code Online (Sandbox Code Playgroud)

  • 它克隆了一个集合链接,因此 myCollection 中的更改将跟随 clonedCollection 中的更改 (2认同)

Dan*_*olm 5

另一种选择,如果您需要以下内容(这是我发现这个问题时正在寻找的内容;)):

  • 集合的副本应该与原始集合的类型相同(例如,您已经创建了自己的扩展 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);
Run Code Online (Sandbox Code Playgroud)

Backbone.Collection 上的通用克隆方法会很尴尬,因为模型及其嵌套对象是通过引用复制还是自身被克隆,总是会有微妙之处。根据您的场景,要求会有很大差异,因此您需要编写所需的内容。