2012-08-01 9 views
41

Mam zdefiniowany model i kolekcji:Filtr trzon kolekcji przez wartość atrybutu

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

}); 

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

Gdy kolekcja jest wypełniana modeli, muszę nową kolekcję Pudła z modeli pole, które mają określony kolor atrybut zawarty w pełnej kolekcji, robię to w następujący sposób:

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); 

To działa, ale uważam, że jest nieco skomplikowany i nieefektywny. Czy istnieje sposób na zrobienie tego samego w prosty sposób?

Oto kod opisałem: http://jsfiddle.net/HB88W/1/

Odpowiedz

82

Lubię wracać nowe wystąpienie kolekcji. Dzięki temu te metody filtrowania można przenosić (na przykład boxes.byColor("red").bySize("L")).

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

Spowoduje to zmianę Cid w modelu? – janetsmith

+4

filterBy: function (attribute, value) { filtered = this.filter (function (box) { return box.get (atrybut) === wartość; }); powrót nowe pudełka (filtrowane); } – Josh

+0

Dlaczego warto zwrócić 'new Boxes()'. Chciałbym napisać var pola = Backbone.Collection.extend ({ model: pudełko, byColor: function (kolor) { powrót this.filter (function (box) { box.get powrotu ("kolor") = == color; }); } }); – marcoslhc

43

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

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

var red_collection = new Boxes(red_boxes); 
+8

'where' zwraca tablicę kolekcji, a nie obiekt kolekcji. – seebiscuit

+0

To świetne rozwiązanie, chyba że zmuszony jesteś do używania starszej wersji szkieletu, który nie ma jeszcze "miejsca". – paniclater