временная магистральная коллекция для редактирования моделей

Я работаю с коллекцией и моделями:

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!

Как разделить две коллекции моделей??


person Kev    schedule 18.04.2013    source источник


Ответы (3)


Вам нужно будет клонировать коллекцию. Вот один из способов сделать это.

var tempStuffCollection = new StuffCollection();
stuffCollection.each(function(model) {
  tempStuffCollection.add(new Backbone.Model(model.toJSON()));
});
person Scott Puleo    schedule 18.04.2013
comment
вы имеете в виду: tempStuffCollection.add(new Backbone.Model(model.toJSON())); - person Kev; 18.04.2013
comment
это не работает для меня, но я также использую реляционные модели Backbone... Я получаю эту ошибку: Невозможно создать более одного экземпляра Backbone.RelationalModel с одинаковым идентификатором для каждого типа! - person Kev; 18.04.2013

Ваша проблема, похоже, в том, что у вас не может быть дважды одной и той же модели. Таким образом, вы можете сделать что-то вроде:

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

Затем выполните обратную операцию...

person Loamhoof    schedule 18.04.2013

Причина, по которой это, вероятно, не работает для вас, заключается в том, что 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

person frodo2975    schedule 19.04.2013