2012-05-24 23 views
5

Se si dispone di una raccolta Backbone e si desidera creare una copia di tale raccolta con determinate voci filtrate, come posso farlo mantenendo l'istanza copiata come Backbone.Collection?Filtro backbone

Esempio:

var Module = Backbone.Model.extend(); 

var ModuleCollection = Backbone.Collection.​extend({ 
    model: Module 
}); 

​var modules = new ModuleCollection; 

​modules.add({foo: 'foo'​​​​​​},{foo: 'bar'});​​​​​ 

console.log(modules instanceof Backbone.Collection); // true 

var filtered = modules.filter(function(module) { 
    return module.get('foo') == 'bar'; 
}); 

console.log(filtered instanceof Backbone.Collection); // false 

http://jsfiddle.net/m9eTY/

Nell'esempio precedente, vorrei filtered per essere una versione filtrata di moduli, non solo una serie di modelli.

In sostanza, vorrei creare un metodo nell'istanza di raccolta in grado di filtrare determinati modelli e restituire l'istanza Backbone.Collection, ma non appena inizio il filtraggio i metodi di iterazione restituiscono un array.

risposta

9

È possibile racchiudere l'array filtrato in una ModuleCollection temporanea, se lo si desidera, i modelli filtrati sono le stesse istanze di quelli presenti in ModuleCollection originale, quindi se l'attributo del modulo viene modificato, viene comunque referenziato da entrambe le raccolte.

quindi quello che consiglio di fare è qualcosa di simile:

var filtered = new ModuleCollection(modules.filter(function (module) { 
    return module.get('foo') == 'bar'; 
})); 

Dal Backbone 0.9.2 v'è un ulteriore metodo chiamato where che fa lo stesso:

var filtered = modules.where({foo: 'bar'}); 

che restituisce ancora una matrice però, così sarà ancora bisogno di avvolgere come tale:

var filtered = new ModuleCollection(modules.where({foo: 'bar'})); 
+0

ha un senso. Grazie! – David

0

per fil raccolta Tering utilizzando dorsale

Per rendere il filtro si dovrebbe avere una funzione filtrato nella vostra collezione

var MyCollection = Backbone.Collection.extend ({ 
    filtered : function() { 

Suggerisco di utilizzare il filtro di sottolineatura che ritornerà vero per valide e false per nullo se vero è quello che sei cercando. utilizzare this.models per ottenere i modelli di raccolta attuali utilizzano model.get ('') per ottenere l'elemento che si desidera verificare la presenza di

var results = _.filter(this.models, function (model) {   
    if (model.get('foo') == 'bar') 
    return true ; 
    return false ; 
}); 

Poi uso sottolineano mappa i risultati e trasformarlo a JSON come questo è dove probally si stanno ottenendo sbagliato

results = _.map(results, function(model) { return model.toJSON() }); 

Infine restituendo una nuova collezione spina dorsale con solo risultati di questa è come fare una raccolta copiato

return new Backbone.Collection(results) ;