我正在处理一个集合和模型:
var StuffCollection = Backbone.Collection;
var StuffModel = Backbone.RelationalModel;
在一个地方,我用模型创建了一个集合的实例:
var stuffCollection = new StuffCollection();
// do stuff here to load a bunch of models
我想克隆这个集合来编辑,而不编辑原始的
var tempStuffCollection = new StuffCollection();
tempStuffCollection.reset(stuffCollection.models);
// do stuff here to edit the collection
但是当我在tempStuffCollection中编辑模型时,它们在stuffCollection中编辑所以我试着这样做:
var tempStuffCollection = new StuffCollection();
tempStuffCollection.reset(stuffCollection.toJSON());
// do stuff here to edit the collection
所以看起来所有的引用都被删除了…但是没有!当我在tempStuffCollection中编辑模型时,它仍然会在stuffCollection中更改它们!
我如何分离模型的两个集合??
您需要克隆该集合。这是一种方法。
var tempStuffCollection = new StuffCollection();
stuffCollection.each(function(model) {
tempStuffCollection.add(new Backbone.Model(model.toJSON()));
});
你的问题似乎是你不能有两次相同的模型。你可以这样写:
var tempStuffCollection = new StuffCollection();
stuffCollection.each(function(model) {
var json = model.toJSON();
json._id = json.id; // _id is maybe a reserved attribute, change it if needed
delete json.id;
tempStuffCollection.add(new Backbone.Model(json));
});
它可能不适合您的原因是Backbone Relational计算出您放入临时集合中的模型与原始集合中的模型相同,因此它使用旧模型代替。它通过查看每个模型的idAttribute来实现这一点。
因此,您可以尝试在将模型放入临时集合时更改模型的idAttribute的名称,然后在完成后将其更改回来。
也许像这样把它们放入你的临时集合:
var parsedStuffCollection = stuffCollection.toJSON()
_.each(parsedStuffCollection, function(stuffAttributes){
stuffAttributes.tempIDAttribute = stuffAttributes.myIdAttribute;
delete stuffAttributes.myIdAttribute;
})
var tempStuffCollection = new StuffCollection({parsedStuffCollection});
然后,执行反向操作将它们更改回
编辑:刚刚意识到这和Loamhoof的答案完全一样