2012-09-12 12 views
27

Angenommen, es gibt 2 Sammlungen, die jeweils /api/page/1 und /api/page/2 darstellen; Gibt es trotzdem (beispielsweise durch Underscore), diese 2 Sammlungen in eine neue, einzelne Sammlung zusammenzuführen?Backbone - 2 Kollektionen zusammenfügen?

Antwort

48

Option 1

Wenn Sie die Sammlung noch geholt haben, können Sie die erste holen, holen dann die zweite mit dem {add: true} Flagge und der zweite wird

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 you'v: in die erste einer verschmolzen werden e geholt bereits die Sammlungen und sie in zwei Variablen gespeichert haben, können Sie einfach alle Inhalte der zweiten Sammlung in die erste hinzu:

collection1.add(collection2.toJSON()); 

Diese Optionen leidet unter der Tatsache, dass die erste Kollektion der „add abfeuern "Ereignis, wenn die zweite Sammlung hinzugefügt wird. Wenn diese Nebenwirkungen wie unerwünschte UI hat, die neu macht auf dieses Ereignis durch, können Sie es, indem Sie die {silent: true} unterdrücken kann Flag

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

Option 3

Wenn Sie gerade brauchen das JSON-Format dieser Sammlungen, dfür HTML-Template-Rendering Zwecke, können Sie einfach alles zu JS Literale (Arrays, Objekte) reduzieren:

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

Option 4 = Option 2 + 3

Wenn Sie schon geholt bereits beide Sammlungen, Sie kann JS Literale reduzieren und alles zu einer frischen Backbone Sammlung

var rawCollection = collection1.toJSON().concat(collection2.toJSON()); 
var newCollection = new Backbone.Collection(rawCollection); 
+1

Danke für die gründliche Erklärung =) – Kay

+12

-1. Wenn Sie jSON() aufrufen, verlieren Sie den Bezug zu den Modellen. Wenn Sie ein Modell erstellen, es in eine Sammlung einfügen, die Sammlung mit einer anderen zusammenführen, das Modell ändern, wird das Modell in der letzten Sammlung nicht aktualisiert. Dies wird ein Albtraum für das Debuggen. Es wäre in Ordnung, wenn Sie die Modelle kopieren und getrennt halten möchten, aber das ist nicht die Norm und sollte darauf hingewiesen werden. –

+9

Wenn Sie bereits die beiden Sammlungen haben, sollten Sie wahrscheinlich eine der folgenden Antworten verwenden: 'collection1.add (collection2.models);' –

0

Es scheint mir, dass Sie dabei die Semantik verlieren, die an /api/page/{1, 2}/ gebunden ist.

Es scheint mir auch, dass weder Rückgrat, noch unterstreichen, bietet Ihnen eine Funktion/Methode genau das, was Sie tun wollen.

So Ihre Optionen:

  • eine neue Sammlung erstellen, jedes Element aus der vorherigen Sammlungen hinzufügen;
  • hinzufügen erstes Kollektion Elemente in dem zweiten

Aber Sie wahrscheinlich schon kannten.

+0

Ja. Ich denke, die Lösung hier ist 1 Sammlung zu haben und Sie holen ({data: {page: 1}, add: true}) '. Erhöhen Sie den Seitenwert mit jedem 'fetch()' und fügen Sie den neuesten Stapel/die neueste Seite der Modelle in die Sammlung ein. – jmk2142

+0

Ihre Lösung scheint ziemlich hübsch, aber ich denke, er hat bereits die Sammlungen abgerufen, und möchte wahrscheinlich vermeiden, die Daten erneut zu übertragen. Aber wenn es der Fall ist, dann ist dein Weg ein guter Weg. – ksol

5
collection.add(models, [options]) 

Collection Array von Modellen

collection.models 

kehrt Array von Modellen

ein Modell hinzufügen (oder eine Reihe von Modellen) zu der Sammlung.

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.. 
0

Collection.models bietet direkten Zugriff auf das Array von moels und Collection.add wird eine Reihe von Modellen als Argument nehmen.

5

Verwendung

collection.models 

von

insted diese
collection.toJSON() 
41

versuchen, ist Sammlung Reihe von Modellen

collection1.add(collection2.models); 

wenn wir verwenden

collection1.add(collection2.toJSON()); 

dann Referenz chage

+6

+1 Das ist die einzige echte Antwort, sollte wirklich die akzeptierte sein. Siehe Dokumentation: http://backbonejs.org/#Collection-add. Sie können auch entscheiden, ob Sie Duplikate akzeptieren oder nicht, indem Sie Folgendes übergeben: {merge: true} –