Магистраль - объединить 2 коллекции вместе?
Предположим, есть 2 Коллекции, представляющие соответственно /api/page/1
а также /api/page/2
; есть ли способ (например, через Underscore) объединить эти 2 коллекции в новую единую коллекцию?
6 ответов
Опция 1
Если вы еще не получили коллекцию, вы можете получить первую, а затем выбрать вторую с флагом {add: true}, и вторая будет объединена с первой:
collection.fetch({data : {page : 2});
=> [{id: 1, article : "..."}, {id: 2, article : "..."}];
collection.fetch({data : {page : 2}, add : true });
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, {id: 3, article : "..."}];
Вариант 2
Если вы уже получили коллекции и сохранили их в двух переменных, вы можете просто добавить все содержимое второй коллекции в первую:
collection1.add(collection2.toJSON());
Эта опция страдает от того факта, что первая коллекция вызовет событие "add", когда вторая коллекция будет добавлена к нему. Если у этого есть побочные эффекты, такие как нежелательный пользовательский интерфейс, который повторно визуализируется из-за этого события, вы можете подавить его, добавив флаг {silent: true}
collection1.add(collection2.toJSON(), {silent : true});
Вариант 3
Если вам нужен только формат JSON этих коллекций, т. Е. Для целей рендеринга шаблонов HTML, вы можете просто свести все к литералам JS (массивам, объектам):
collection1.toJSON().concat(collection2.toJSON());
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, ...];
Вариант 4 = Вариант 2 + 3
Если вы уже загрузили обе коллекции, вы можете перейти к литералам JS и добавить все в новую коллекцию Backbone.
var rawCollection = collection1.toJSON().concat(collection2.toJSON());
var newCollection = new Backbone.Collection(rawCollection);
Попробуйте это, коллекция это массив моделей
collection1.add(collection2.models);
если мы используем
collection1.add(collection2.toJSON());
тогда ссылка
collection.add(models, [options])
Коллекция это массив моделей
collection.models
возвращает массив моделей
Добавить модель (или массив моделей) в коллекцию.
A = Backbone.Collection;
collection1 = new A([
{key, 'value'}, //model1
{key : value1} //model2 in collection1
]);
B = Backbone.Collection;
collection2 = new B([
{key1, 'value'}, //model1
{key1 : value1} //model2 in collection2
]);
collection1.add(collection2.models); //now, collection1 has four models..
Использование
collection.models
поставленный
collection.toJSON()
Мне кажется, что, делая это, вы теряете семантику, привязанную к /api/page/{1, 2}/
,
Мне также кажется, что ни основа, ни подчеркивание не предоставляют вам функцию / метод, выполняющий именно то, что вы пытаетесь сделать.
Итак, ваши варианты:
- создать новую коллекцию, добавить каждый элемент из ваших предыдущих коллекций;
- добавить первые элементы коллекции ко второму
Но вы, наверное, уже знали это.
Collection.models обеспечивает прямой доступ к массиву moels, а Collection.add примет массив моделей в качестве аргумента.