2011-06-22 9 views
6

Tengo un Backbone.Collection lleno de modelos; digamos que el modelo es Car. Esta colección es una gran lista grande de Cars. Quiero poder seleccionar algunos identificadores de automóviles específicos de una lista, y luego poder sacar solo los objetos seleccionados de esta colección.Backbone.js: ¿Cómo puedo filtrar una colección de objetos por una matriz de ID de modelo?

Mi bloque de código a continuación no funciona; Estoy seguro de que hay una forma de hacerlo con Backbone.js/Underscore.js ... También estoy muy fresco para Backbone/Underscore.

CarList = Backbone.Collection.extend({ 
    model: Car, 
    filterWithIds: function(ids) { 
     return this.filter(function(aCar) { return _.contains(ids, car.id); } 
    } 
}); 

¿Alguna sugerencia?

+1

La función anónima pasada a 'this.filter' le falta una declaración de devolución. A diferencia de otros lenguajes (por ejemplo, Ruby), JavaScript no usa la última expresión de una función como valor de retorno predeterminado. (Además, la línea que asigna 'this' a' coll' es redundante.) –

+0

Tienes razón, Niall ... Estaba traduciendo mi código de CoffeeScript con solo mirarlo y lo dejé; y al simplificar mi código, dejé accidentalmente esa línea redundante. He reparado el ejemplo de mi código. –

Respuesta

12

De acuerdo, creo que lo tengo. Está cerca de mi bloque de código original, pero la función filterWithIds actualizada está aquí.

filterWithIds: function(ids) { 
    return _(this.models.filter(function(c) { return _.contains(ids, c.id); })); 
} 

Para los siguientes en CoffeeScript (Yo soy), aquí está la versión de CoffeeScript.

filterWithIds: (ids) -> _(@models.filter (c) -> _.contains ids, c.id) 

Es mi respuesta; cualquier código huele?

+2

En lugar de usar include, puede probar la condición 'c.id in ids', que coffeescript convierte en un bucle for comprobando cada id contra c.id. – c3rin

+3

Desde que se publicó esta respuesta, 'include' se renombró a' contains'. – hughes

+0

Gracias, @hughes. ¡Fijo! –

Cuestiones relacionadas