用于编辑模型的临时主干集合

时间:2013-04-18 19:28:10

标签: javascript backbone.js backbone-relational

我正在使用一个集合和模型:

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中更改它们!

如何分离两个模型集合?

3 个答案:

答案 0 :(得分:2)

您需要克隆该集合。这是一种方法。

var tempStuffCollection = new StuffCollection();
stuffCollection.each(function(model) {
  tempStuffCollection.add(new Backbone.Model(model.toJSON()));
});

答案 1 :(得分:0)

您的问题似乎是您不能拥有相同型号的两倍。所以你可以这样做:

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

然后进行逆操作......

答案 2 :(得分:0)

它可能不适合你的原因是Backbone Relational指出你在temp系列中放入的模型与原始集合中的模型相同,所以它使用的是旧模型。它通过查看每个模型的idAttribute来实现。

因此,您可以尝试在将模型放入临时集合时更改模型的idAttribute的名称,然后在完成后将其更改回来。

也许这样的东西将它们放入你的临时收藏中:

var parsedStuffCollection = stuffCollection.toJSON()

_.each(parsedStuffCollection, function(stuffAttributes){
    stuffAttributes.tempIDAttribute = stuffAttributes.myIdAttribute;
    delete stuffAttributes.myIdAttribute;
})

var tempStuffCollection = new StuffCollection({parsedStuffCollection});

然后,只需反过来改变它们

编辑:刚刚意识到这与Loamhoof的答案完全一样