web-dev-qa-db-fra.com

Backbone - Merge 2 Collections ensemble?

Supposons qu'il y ait 2 collections, représentant respectivement /api/page/1 et /api/page/2; Y a-t-il un moyen (via Underscore, par exemple) de fusionner ces 2 collections dans une nouvelle collection unique?

27
gsklee

Option 1

Si vous n'avez pas encore récupéré la collection, vous pouvez récupérer le premier, puis récupérer le second avec l'indicateur {add: true} et le second sera fusionné dans le premier:

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 : "..."}];

Option 2

Si vous avez déjà récupéré les collections et les avez stockées dans deux variables, vous pouvez simplement ajouter tout le contenu de la deuxième collection à la première:

collection1.add(collection2.toJSON());

Cette option souffre du fait que la première collection déclenche l'événement "add" lorsque la deuxième collection lui est ajoutée. Si cela a des effets secondaires tels qu'une interface utilisateur indésirable qui est restituée à cause de cet événement, vous pouvez le supprimer en ajoutant l'indicateur {silent: true}.

collection1.add(collection2.toJSON(), {silent : true});

Option 3

Si vous avez simplement besoin du format JSON de ces collections, c'est-à-dire pour le rendu des modèles HTML, vous pouvez simplement tout réduire en littéraux JS (tableaux, objets):

collection1.toJSON().concat(collection2.toJSON());
=> [{id: 1, article : "..."}, {id: 2, article : "..."}, ...];

Option 4 = Option 2 + 3

Si vous avez déjà récupéré les deux collections, vous pouvez réduire le nombre de littéraux JS et tout ajouter à une nouvelle collection Backbone.

var rawCollection = collection1.toJSON().concat(collection2.toJSON());
var newCollection = new Backbone.Collection(rawCollection);
49
Gur Dotan

essayez ceci, la collection est un tableau de modèles

collection1.add(collection2.models); 

si on utilise

 collection1.add(collection2.toJSON());

puis référence chage

41
user1672982

utilisation

collection.models

au lieu de

collection.toJSON()
5
user1665142
collection.add(models, [options]) 

Collection est un tableau de modèles

collection.models

retourne un tableau de modèles

Ajoutez un modèle (ou un tableau de modèles) à la collection.

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..
5
Array out of bound

Il me semble qu'en faisant cela, vous perdez la sémantique liée à /api/page/{1, 2}/.

Il me semble également que ni le réseau principal, ni le trait de soulignement, ne vous fournit une fonction/méthode faisant exactement ce que vous essayez de faire.

Donc vos options:

  • créer une nouvelle collection, ajouter chaque élément de vos collections précédentes;
  • ajouter les premiers objets de collection au second

Mais vous le saviez probablement déjà.

0
ksol

Collection.models fournit un accès direct au tableau de modèles et Collection.add prendra un tableau de modèles en argument.

0
Chris A