2012-09-12 13 views
27

Załóżmy, że istnieją 2 kolekcje, reprezentujące odpowiednio /api/page/1 i /api/page/2; czy tak jest (na przykład przez Underscore), aby połączyć te 2 Kolekcje w nową, pojedynczą Kolekcję?Szkielet - Połącz 2 kolekcje razem?

Odpowiedz

48

Wariant 1

Jeśli nie przyniosła jeszcze kolekcję można pobrać pierwszy z nich, a następnie pobrać drugi z {dodać: true} flagi a drugi będzie zostać połączone w pierwszy:

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

Wariant 2

Jeśli you'v e już pobrane zbiory i je przechowywać w dwóch zmiennych, można po prostu dodać całą zawartość drugiego zbioru do pierwszego:

collection1.add(collection2.toJSON()); 

Ta opcja cierpi z powodu faktu, że pierwszy zbiór będzie ogień „dodaj "zdarzenie, gdy zostanie do niego dodana druga kolekcja. Jeśli to ma skutki uboczne, takie jak niepożądanego UI, który wczyta z powodu tego wydarzenia, można stłumić go dodając {cichy: true} flagę

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

Wariant 3

Jeśli wystarczy format JSON tych kolekcji, tjszablon HTML dla celów renderingu, można po prostu zredukować wszystko do literałów js (tablic, obiektów):

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

opcja 4 = Opcja 2 + 3

Jeśli już pobrane zarówno kolekcje, ty można zredukować do literałów JS i dodać wszystko do świeżej Backbone kolekcji

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

Dzięki za dokładne wyjaśnienie =) – Kay

+12

-1. Jeśli wywołasz funkcję JSON(), utracisz odniesienie do modeli. Jeśli utworzysz model, wstaw go do kolekcji, połącz kolekcję z inną, zmień model, model z ostatniego zbioru nie jest aktualizowany. To będzie koszmar do debugowania. Byłoby dobrze, gdybyś chciał skopiować modele i zachować je w separacji, ale to nie jest norma i należy to podkreślić. –

+9

Jeśli masz już dwie kolekcje, prawdopodobnie powinieneś używać jednej z poniższych odpowiedzi: 'collection1.add (collection2.models);' –

0

Wydaje mi się, że w ten sposób tracisz semantyczną więź z /api/page/{1, 2}/.

Wydaje mi się również, że ani szkielet, ani podkreślenie, nie zapewnia funkcji/metody, która dokładnie to, co próbujesz zrobić.

więc opcje:

  • utworzyć nową kolekcję, dodać każdy element z poprzednich zbiorów;
  • dodać elementy pierwszy zbiór do drugiego

Ale pewnie już o tym wiedział.

+0

Tak. Myślę, że rozwiązaniem jest tutaj 1 kolekcja i "pobieranie" ({data: {strona: 1}, dodanie: true}). Zwiększ wartość strony za pomocą każdej funkcji 'fetch()' i dodaj najnowszą partię/stronę modeli do kolekcji. – jmk2142

+0

Twoje rozwiązanie wydaje się całkiem ładne, ale wydaje mi się, że ma już pobrane kolekcje i prawdopodobnie chce uniknąć ponownego pobierania danych. Ale jeśli tak jest, to twoja droga to Dobra Droga. – ksol

5
collection.add(models, [options]) 

Collection jest szereg modeli

collection.models 

powraca wachlarz modeli

Dodaj model (lub tablicę modelach) do kolekcji.

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 zapewnia bezpośredni dostęp do tablicy moels i Collection.add odbędzie szereg modeli jako argument.

5

użycie

collection.models 

insted

collection.toJSON() 
41

spróbować, kolekcja jest szereg modeli

collection1.add(collection2.models); 

jeśli używamy

collection1.add(collection2.toJSON()); 

następnie referencyjny numer

+6

+1 To jest jedyna prawdziwa odpowiedź, naprawdę powinna być zaakceptowana. Zobacz dokumentację: http://backbonejs.org/#Collection-add. Możesz też zdecydować, czy chcesz akceptować duplikaty, czy nie, przekazując: {scal: true} –