2012-08-01 5 views
41

Ich habe eine definierte Modell und eine Sammlung:Filter Backbone Sammlung von Attributwert

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

}); 

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

Wenn die Sammlung mit den Modellen bevölkert ist, ich brauche eine neue Kollektion Pappschachtel aus Box-Modelle, die eine bestimmte Farbe haben Attribut in der vollständigen Sammlung enthalten, mache ich es so:

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

Dies funktioniert, aber ich finde es ein bisschen kompliziert und ineffizient. Gibt es eine Möglichkeit, das Gleiche einfacher zu machen? Hier

ist der Code, den ich beschrieben: http://jsfiddle.net/HB88W/1/

Antwort

82

Ich mag eine neue Instanz der Sammlung zurück. Dies macht diese Filtermethoden verkettbar (boxes.byColor("red").bySize("L"), zum Beispiel).

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

wird diese Änderung cid in Modell? – janetsmith

+4

filterBy: Funktion (Attribut, Wert) { gefiltert = this.filter (Funktion (Box) { Rückgabe box.get (Attribut) === Wert; }); Rückgabe neuer Boxen (gefiltert); } – Josh

+0

Warum ein 'new Boxes()' zurückgeben. Box, byColor:: function (Farbe) { return this.filter (function (box) { return box.get ("color") = I würde var Boxes = Backbone.Collection.extend ({ Modell schreiben == Farbe; }); } }); – marcoslhc

43

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

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

var red_collection = new Boxes(red_boxes); 
+8

'where' gibt ein Array der Collection und nicht ein Collection-Objekt zurück. – seebiscuit

+0

Dies ist eine großartige Lösung, es sei denn, Sie werden gezwungen, eine ältere Version von Backbone zu verwenden, die noch nicht "wo" implementiert hat. – paniclater