2012-09-12 19 views
27

Supongamos que hay 2 colecciones, que representan respectivamente /api/page/1 y /api/page/2; ¿hay alguna forma (por ejemplo, underscore) para fusionar estas 2 colecciones en una nueva colección única?Backbone - Fusionar 2 colecciones juntas?

Respuesta

48

Opción 1

Si no haber recogido el la colección sin embargo, se puede recuperar la primera, a continuación, buscar el segundo con el {add: true} bandera y el segundo se se fusionarán en la primera:

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

Opción 2

Si you'v e ya se fue a buscar las colecciones y hacer que se almacena en dos variables, puede simplemente añadir todos los contenidos de la segunda colección en la primera:

collection1.add(collection2.toJSON()); 

Esta opción adolece del hecho de que la primera colección se disparará el "add "evento cuando se agrega la segunda colección. Si esto no tiene efectos secundarios como la interfaz de usuario no deseado que vuelve a renderizar debido a este evento, puede suprimirla añadiendo el {silenciosa: true} bandera

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

Opción 3

Si sólo necesita el formato JSON de estas colecciones, es decir,con fines plantilla de representación HTML, sólo puede reducir todo a los literales de JS (matrices, objetos):

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

Opción 4 Opción = 2 + 3

Si ya ha arreó dos recopilatorios, puede reducir a los literales JS y añadir todo a una colección fresca Backbone

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

Gracias por la explicación detallada =) – Kay

+12

-1. Si llama a JSON() pierde la referencia a los modelos. Si crea un modelo, insértelo en una colección, combine la colección con otra, cambie el modelo, el modelo de la última colección no se actualiza. Esto se convertirá en una pesadilla para depurar. Estaría bien si quisiera copiar los modelos y mantenerlos separados, pero no es la norma y debe señalarse. –

+9

Si ya tiene las dos colecciones, probablemente debería usar cualquiera de las siguientes respuestas que usan: 'collection1.add (collection2.models);' –

0

Me parece que al hacer esto, pierdes la semántica vinculada a /api/page/{1, 2}/.

También me parece que ni la columna vertebral, ni subrayado, le proporciona una función/método de hacer exactamente lo que estás tratando de hacer.

por lo que sus opciones:

  • crear una nueva colección, agregue cada elemento de sus colecciones anteriores;
  • añadir primeros elementos de la colección a la segunda

Pero es probable que ya lo sabían.

+0

Sí. Creo que la solución aquí es tener 1 colección y 'obtener ({data: {page: 1}, add: true})'. Incremente el valor de la página con cada 'fetch()' y agregue el último lote/página de modelos en la colección. – jmk2142

+0

Su solución parece bastante bonita, sin embargo, creo que ya ha recogido las colecciones, y probablemente quiera evitar volver a buscar los datos. Pero si se nota el caso, entonces tu camino es A Good Way. – ksol

5
collection.add(models, [options]) 

Collection es gama de modelos

collection.models 

vuelve gama de modelos

Añadir un modelo (o una serie de modelos) a la colección.

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 ofrece acceso directo a la gama de moels y Collection.add tendrá una gran variedad de modelos como argumento.

5

uso

collection.models 

insted de

collection.toJSON() 
41

probar esto, colección es variedad de modelos

collection1.add(collection2.models); 

si utilizamos

collection1.add(collection2.toJSON()); 

luego referencia chage

+6

+1 Esa es la única respuesta real, realmente debería ser la aceptada. Ver documentación: http://backbonejs.org/#Collection-add. También puede decidir si acepta o no duplicados pasando: {merge: true} –