2012-08-01 10 views
41

Ho un modello definito e una collezione:Filtro spina dorsale di raccolta per valore di attributo

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

}); 

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

quando la raccolta è popolata con i modelli, ho bisogno di una nuova collezione Scatole fatto di modelli di sicurezza che hanno un colore specifico attributo contenuto nella raccolta completa, lo faccio in questo modo:

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

Questo funziona, ma lo trovo un po 'complicato e poco efficiente. C'è un modo per fare questa stessa cosa in un modo più semplice?

ecco il codice che ho descritto: http://jsfiddle.net/HB88W/1/

risposta

82

mi piace tornare una nuova istanza della collezione. Ciò rende concatenabili questi metodi di filtraggio (boxes.byColor("red").bySize("L"), ad esempio).

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

Sarà questo cambiamento Cid a modello? – janetsmith

+4

filterBy: function (attributo, valore) { filtrato = this.filter (function (box) { return box.get (attribute) === value; }); restituisce nuove caselle (filtrate); } – Josh

+0

Perché restituire un 'nuove scatole()'. Vorrei scrivere var = Scatole Backbone.Collection.extend ({ modello di sicurezza, byColor: la funzione (colore) { ritorno this.filter (function (box) { ritorno box.get ("colore") = == colore; }); } }); – marcoslhc

43

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

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

var red_collection = new Boxes(red_boxes); 
+8

'where' restituisce una matrice della raccolta, piuttosto che un oggetto di raccolta. – seebiscuit

+0

Questa è un'ottima soluzione, a meno che non si sia costretti a utilizzare una versione precedente di Backbone che non ha ancora implementato "where". – paniclater

Problemi correlati