5

如果我有一个 Backbone 集合,并且想要创建该集合的副本并过滤掉某些条目,我该如何在将复制的实例保留为 Backbone.Collection 的同时做到这一点?

例子:

​</p>

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/

在上面的示例中,我想filtered成为模块的过滤版本,而不仅仅是模型数组。

本质上,我想在集合实例中创建一个可以过滤掉某些模型并返回Backbone.Collection实例的方法,但是一旦我开始过滤迭代方法就会返回一个数组。

4

2 回答 2

9

如果需要,您可以将过滤后的数组包装在临时 ModuleCollection 中,过滤后的模型与原始 ModuleCollection 中的模型相同,因此如果模块的属性发生更改,两个集合仍会引用它。

所以我建议你做的是:

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

从 Backbone 0.9.2 开始,有一个额外的方法where可以做同样的事情:

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

尽管如此,它仍然返回一个数组,所以你仍然需要这样包装它:

var filtered = new ModuleCollection(modules.where({foo: 'bar'}));
于 2012-05-24T16:47:36.467 回答
0

用于使用主干过滤集合

要制作过滤器,您的集合中应该有一个过滤功能

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

我建议使用 UnderScore 过滤器,它将为有效返回 true,为无效返回 false,其中 true 是您要查找的内容。使用 this.models 获取当前集合模型 使用 model.get( '' ) 获取要检查的元素

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

然后使用下划线映射您的结果并将其转换为 JSON,这可能是您弄错的地方

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

最后返回一个只有结果的新主干集合这是如何制作一个复制的集合

return new Backbone.Collection( results ) ;
于 2013-10-18T14:09:48.687 回答