2012-05-24 17 views
5

Jeśli mam kolekcję Backbone i chcesz utworzyć kopię tej kolekcji z niektórych zapisów odfiltrowane, w jaki sposób można to zrobić zachowując skopiowany instancji jako Backbone.Collection?Backbone filtrowanie

przykład:

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/

W powyższym przykładzie, ja jak filtered być przefiltrowanej wersji modułów nie tylko szereg modeli.

Zasadniczo chciałbym utworzyć metodę w instancji kolekcji, która może filtrować niektóre modele i zwracać instancję Backbone.Collection, ale zaraz po uruchomieniu filtrowania metody iteracji zwraca tablicę.

Odpowiedz

9

Możesz zawinąć filtrowaną tablicę w tymczasowym ModuleCollection, jeśli chcesz, modele filtrowane są tymi samymi instancjami z tych w oryginalnym ModuleCollection, więc jeśli atrybut modułu ulegnie zmianie, nadal będzie odnosił się do obu kolekcji.

więc co proponuję zrobić coś jak:

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

Od Backbone 0.9.2 istnieje dodatkowa metoda zwana where że robi to samo:

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

że nadal zwraca tablicę mimo to nadal musisz go opakować jako:

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

sens. Dzięki! – David

0

Dla fil kolekcja tering użyciu kręgosłup

Aby filtr powinno być filtrowane funkcję w swojej kolekcji

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

Proponuję użyć filtru podkreślenia która zwróci true za ważne i false dla nieważne gdzie prawdziwe jest to, co jesteś szukam. używać this.models uzyskać aktualne modele kolekcji używać model.get („”), aby uzyskać element, który chcesz sprawdzić

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

następnie użyj podkreślenia map wyników i przekształcenie go do JSON jak to jest gdzie probally są coraz to źle

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

Wreszcie powrocie nową kolekcję szkieletowej z wynikami tylko ten sposób, aby skopiowany collection

return new Backbone.Collection(results) ;