如果我有一个主干集合,并想要创建该集合的副本并过滤掉某些条目,我如何在将复制的实例保留为Backbone.Collection的同时执行此操作?
示例:
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); // falsehttp://jsfiddle.net/m9eTY/
在上面的示例中,我希望filtered是模块的过滤版本,而不仅仅是模型的数组。
从本质上讲,我希望在集合实例中创建一个方法,该方法可以过滤掉某些模型并返回Backbone.Collection实例,但是一旦我开始过滤迭代方法,就会返回一个数组。
发布于 2012-05-25 00:47:36
如果需要,您可以将过滤后的数组包装在临时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'}));发布于 2013-10-18 22:09:49
用于使用主干过滤集合
要创建过滤器,您的集合中应该有一个已过滤的函数
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 ) ;https://stackoverflow.com/questions/10741778
复制相似问题