2

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

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

如何分离两个模型集合?

4

3 回答 3

2

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

var tempStuffCollection = new StuffCollection();
stuffCollection.each(function(model) {
  tempStuffCollection.add(new Backbone.Model(model.toJSON()));
});
于 2013-04-18T19:32:54.777 回答
0

它可能对您不起作用的原因是 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 的回答完全相同

于 2013-04-19T19:35:11.867 回答
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));
});

然后进行逆运算...

于 2013-04-18T23:00:10.857 回答