2012-05-24 11 views
5

Si tengo una colección de red troncal y quiero crear una copia de esa colección con algunas entradas filtradas, ¿cómo puedo hacer eso manteniendo la instancia copiada como Backbone.Collection?Filtrado de red troncal

Ejemplo:

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/

En el ejemplo anterior, me gustaría filtered ser una versión filtrada de los módulos, y no sólo una serie de modelos.

Esencialmente, me gustaría crear un método en la instancia de recopilación que pueda filtrar ciertos modelos y devolver la instancia Backbone.Collection, pero tan pronto como empiece a filtrar los métodos de iteración se devuelve una matriz.

Respuesta

9

Puede envolver la matriz filtrada en un ModuleCollection temporal si lo desea, los modelos filtrados son las mismas instancias de las ModuleCollection originales, por lo que si el atributo del módulo cambia, todavía se hace referencia en ambas colecciones.

así que lo que sugiero que hacer es algo como:

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

Desde Backbone 0.9.2 existe un método adicional llamado where que hace lo mismo:

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

que todavía devuelve una matriz sin embargo, entonces todavía tendrá que envolverlo como tal:

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

tiene sentido. ¡Gracias! – David

0

Para fil colección tering utilizar una estructura básica

Para hacer que el filtro debe tener una función de filtrado en su colección

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

Es mejor utilizar el filtro subrayado que devolverá cierto para válidos y falsa de nulidad en los casos cierto es lo que eres buscando. this.models utilizar para obtener los modelos de captación de corriente utilizan model.get ('') para obtener el elemento que desea comprobar para

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

Entonces utilización subrayan mapa de sus resultados y la transforman a JSON como este es donde PROBally que está recibiendo mal

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

Finalmente devuelve una colección nueva columna vertebral con sólo los resultados que esto es cómo hacer una colección copiado

return new Backbone.Collection(results) ; 
Cuestiones relacionadas