Магистраль - объединить 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 примет массив моделей в качестве аргумента.

Другие вопросы по тегам