2011-05-09 15 views
14

Tengo una situación con backbone.js donde tengo una colección de modelos y algo de información adicional sobre los modelos. Por ejemplo, imagine que estoy devolviendo una lista de cantidades: tienen una cantidad asociada con cada modelo. Supongamos ahora que la unidad para cada una de las cantidades es siempre la misma: digamos cuartos. A continuación, el objeto JSON vuelva de mi servicio podría ser algo como:Persistencia y carga de metadatos en una colección backbone.js

{ 
    dataPoints: [ 
     {quantity: 5 }, 
     {quantity: 10 }, 
     ... 
    ], 
    unit : quarts 
} 

Ahora colecciones columna vertebral no tienen ningún mecanismo real para asociar de forma nativa este meta-datos con la colección, pero me fue sugerida en esta pregunta: Setting attributes on a collection - backbone js que puedo ampliar la colección con una función de estilo .meta(property, [value]), que es una gran solución. Sin embargo, naturalmente se deduce que nos gustaría poder recuperar estos datos de una respuesta JSON como la que tenemos arriba.

Backbone.js nos da la función parse(response), que nos permite especificar dónde extraer la lista de modelos de la colección en combinación con el atributo url. Sin embargo, no hay manera de que yo sepa, para hacer una función más inteligente sin sobrecargar fetch(), que eliminaría la funcionalidad parcial que ya está disponible.

Mi pregunta es esta: ¿hay una mejor opción que sobrecargar fetch() (y tratar de llamarlo a la implementación de la superclase) para lograr lo que quiero lograr?

Gracias

Respuesta

22

Personalmente, me gustaría envolver el Collection dentro de otro Model, y luego anular parse, así:

var DataPointsCollection = Backbone.Collection.extend({ /* etc etc */ }); 
var CollectionContainer = Backbone.Model.extend({ 
    defaults: { 
     dataPoints: new DataPointsCollection(), 
     unit: "quarts" 
    }, 
    parse: function(obj) { 
     // update the inner collection 
     this.get("dataPoints").refresh(obj.dataPoints); 

     // this mightn't be necessary 
     delete obj.dataPoints; 

     return obj; 
    } 
}); 

La llamada Collection.refresh() actualiza el modelo con nuevos valores. Pasar un valor meta personalizado a la Colección como se sugirió anteriormente puede impedir que pueda vincularse a esos meta valores.

+0

Sé que esto contradice la respuesta que tiene en el otro post se ha vinculado, pero no lo hago Colecciones tener todas las propiedades de Modelos, como 'parse', para poder anular. Si la Colección necesita que los metadatos tengan significado, entonces también podría reflejar eso en la estructura de objetos que provee Backbone, en lugar de ir 'fuera de banda' con la solución meta-on-collection, IMO. – Stoive

+0

Esto me parece muy razonable. La clave para esto es la capacidad de reemplazar parse/url/fetch en el objeto modelo así como en la colección. Muchas gracias. – idbentley

+6

The Collection.refresh() ahora está en desuso, use Collection.reset() en su lugar. – JMWhittaker

0

Estos meta datos no pertenecen a la colección. Pertenece al nombre o a algún otro descriptor del código. Su código debe declarativamente saber que la colección que tiene solo está llena de elementos de cuarzo. Ya lo hace, ya que la url apunta a los elementos de cuarzo.

var quartzCollection = new FooCollection(); 
quartzCollection.url = quartzurl; 
quartzCollection.fetch(); 

Si realmente necesita para obtener estos datos ¿Por qué no llamas a

_.uniq(quartzCollecion.pluck("unit"))[0];

+0

La unidad no se conoce antes de la llamada AJAX. No uso 'pluck', porque requeriría que cada objeto del modelo en mi colección almacenara la unidad, lo que hace que el tamaño de la respuesta sea mayor que solo asociarlo una vez como metadatos.Además, hay una sobrecarga significativa para hacer una operación así, sospecho. – idbentley

+0

@idbentley Pensé que {dataPoints: ..., unit} era el modelo. Cual es. Es solo que dataPoints es una colección. Así que trátela como se menciona en la respuesta @Stoive. Además, la operación de extracción no es ese gasto. Simplemente asigna los modelos a las unidades. – Raynos

Cuestiones relacionadas