webentwicklung-frage-antwort-db.com.de

Backbone - 2 Sammlungen zusammenführen?

Angenommen, es gibt 2 Sammlungen, die jeweils /api/page/1 und /api/page/2 darstellen. Gibt es eine Möglichkeit (zum Beispiel durch Unterstrich), diese beiden Sammlungen zu einer neuen, einzelnen Sammlung zusammenzuführen?

27
gsklee

Option 1

Wenn Sie die Sammlung noch nicht abgerufen haben, können Sie die erste abrufen und dann die zweite mit dem Flag {add: true} abrufen. Die zweite wird mit der ersten zusammengeführt:

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

Wenn Sie die Sammlungen bereits abgerufen und in zwei Variablen gespeichert haben, können Sie einfach den gesamten Inhalt der zweiten Sammlung der ersten hinzufügen:

collection1.add(collection2.toJSON());

Diese Option leidet unter der Tatsache, dass die erste Sammlung das Ereignis "Hinzufügen" auslöst, wenn die zweite Sammlung hinzugefügt wird. Wenn dies Nebenwirkungen hat, z. B. eine unerwünschte Benutzeroberfläche, die aufgrund dieses Ereignisses erneut gerendert wird, können Sie dies durch Hinzufügen des Flags {silent: true} unterdrücken

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

Option 3

Wenn Sie nur das JSON-Format dieser Sammlungen benötigen, d. H. Für das Rendern von HTML-Vorlagen, können Sie alles auf JS-Literale (Arrays, Objekte) reduzieren:

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

Option 4 = Option 2 + 3

Wenn Sie bereits beide Sammlungen abgerufen haben, können Sie die Anzahl der JS-Literale reduzieren und alles zu einer neuen Backbone-Sammlung hinzufügen

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

versuchen Sie dies, die Sammlung ist ein Array von Modellen

collection1.add(collection2.models); 

wenn wir verwenden

 collection1.add(collection2.toJSON());

dann referenz chage

41
user1672982

benutzen

collection.models

anstatt

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

Sammlung ist eine Reihe von Modellen

collection.models

gibt Array von Modellen zurück

Fügen Sie der Sammlung ein Modell (oder ein Array von Modellen) hinzu.

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

Es scheint mir, dass Sie dadurch die mit /api/page/{1, 2}/ verbundene Semantik verlieren.

Es scheint mir auch, dass weder das Rückgrat noch der Unterstrich Ihnen eine Funktion/Methode zur Verfügung stellen, die genau das tut, was Sie zu tun versuchen.

Also deine Möglichkeiten:

  • erstellen Sie eine neue Sammlung, und fügen Sie jeden Artikel aus Ihren vorherigen Sammlungen hinzu.
  • fügen Sie der zweiten Sammlung erste Elemente hinzu

Aber das wussten Sie wahrscheinlich schon.

0
ksol

Collection.models bietet direkten Zugriff auf das Array von Modellen, und Collection.add verwendet ein Array von Modellen als Argument.

0
Chris A