2012-08-01 15 views
41

Tengo un modelo definido y una colección:Filtro colección cadena principal por valor de atributo

var Box = Backbone.Model.extend({ 
    defaults: { 
     x: 0, 
     y: 0, 
     w: 1, 
     h: 1, 
     color: "black" 
    } 

}); 

var Boxes = Backbone.Collection.extend({ 
    model: Box 
}); 

Cuando la colección se completa con los modelos, necesito una nueva colección de cajas hechas de modelos de cajas que tienen un color específico atributo que figura en la colección completa, lo hago de esta manera:

var sorted = boxes.groupBy(function(box) { 
    return box.get("color"); 
}); 


var red_boxes = _.first(_.values(_.pick(sorted, "red"))); 

var red_collection = new Boxes; 

red_boxes.each(function(box){ 
    red_collection.add(box); 
}); 

console.log(red_collection); 

Esto funciona, pero me parece un poco complicado e ineficiente. ¿Hay alguna forma de hacer lo mismo de una manera más simple?

Este es el código que he descrito: http://jsfiddle.net/HB88W/1/

Respuesta

82

me gusta el retorno de una nueva instancia de la colección. Esto hace que estos métodos de filtrado sean encadenables (boxes.byColor("red").bySize("L"), por ejemplo).

var Boxes = Backbone.Collection.extend({ 
    model: Box, 

    byColor: function (color) { 
     filtered = this.filter(function (box) { 
      return box.get("color") === color; 
     }); 
     return new Boxes(filtered); 
    } 
}); 

var red_boxes = boxes.byColor("red") 
+3

Cambiará esto cid en el modelo? – janetsmith

+4

filterBy: function (attribute, value) { filtered = this.filter (function (box) { return box.get (attribute) === value; }); devolver nuevas Cajas (filtradas); } – Josh

+0

Por qué devolver 'nuevos cuadros()'. Me gustaría escribir Cajas var = Backbone.Collection.extend ({ modelo: caja, byColor: function (color) { retorno this.filter (function (caja) { box.get retorno ("color") = == color; }); } }); – marcoslhc

43

Ver http://backbonejs.org/#Collection-where

var red_boxes = boxes.where({color: "red"}); 

var red_collection = new Boxes(red_boxes); 
+8

'where' devuelve una matriz de la colección, en lugar de un objeto de colección. – seebiscuit

+0

Esta es una gran solución, a menos que se vea forzado a utilizar una versión anterior de Backbone que aún no tenga implementado "dónde". – paniclater

Cuestiones relacionadas