如果我有一个 Backbone 集合并想创建该集合的副本并过滤掉某些条目,我该如何做到这一点同时将复制的实例保留为 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); // false
在上面的示例中,我希望 filtered
是模块的过滤版本,而不仅仅是模型数组。
本质上,我想在集合实例中创建一个方法,该方法可以过滤掉某些模型并返回 Backbone.Collection
实例,但是一旦我开始过滤,迭代方法就会返回一个数组。
最佳答案
如果需要,您可以将过滤后的数组包装在一个临时的 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'}));
关于javascript - 主干过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10741778/