Подтвердить что ты не робот

Как клонировать базовую коллекцию

Есть ли способ легко клонировать коллекцию Backbone? Интересно, почему нет метода сборки, например, для моделей. Моя проблема в том, что у меня есть модель, содержащая набор детей. Когда я клонирую модель. У меня все еще есть набор дочерних элементов, но только с их значениями по умолчанию.

4b9b3361

Ответ 1

Каков ваш вариант использования, который вы хотите клонировать?

В коллекции нет встроенной функции клонирования, потому что вы не хотите клонировать модели внутри коллекции. Клонирование модели приведет к тому, что будут два отдельных экземпляра одной и той же модели, и если вы обновите одну модель, другая не будет обновлена.

Если вы хотите создать новую коллекцию на основе определенных критериев, вы можете использовать метод фильтра коллекции.

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

var freshmenCollection = new Backbone.Collection(freshmenModels);

Чтобы продолжить и клонировать модели в коллекции, вы можете написать следующий код

var clonedCollection = new Backbone.Collection();
studentsCollection.each(function(studentModel) {
  clonedCollection.add(new Backbone.Model(studentModel.toJSON()));
});

Ответ 2

Простейший способ:

var cloned = new Backbone.Collection(original.toJSON());

где original - это коллекция для клонирования.

Можно было бы затем расширить Backbone Collection, чтобы добавить поддержку клонирования w или без поддержки наследования.

Ответ 4

Еще один вариант, если вам нужно следующее (что я искал, когда нашел этот вопрос;)):

  • Копия коллекции должна быть того же типа, что и исходная коллекция (например, вы создали свой собственный тип коллекции, который расширяет 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);

Общий метод клонирования на Backbone.Collection будет неудобным, потому что всегда будут тонкости вокруг того, будут ли модели и их вложенные объекты копироваться по ссылке или сами клонированы. Требования будут сильно различаться в зависимости от вашего сценария, поэтому вам нужно было написать то, что вам нужно.