javascript - 主干过滤

标签 javascript collections backbone.js models underscore.js

如果我有一个 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

http://jsfiddle.net/m9eTY/

在上面的示例中,我希望 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/

相关文章:

web-services - Backbone 模型和集合是否期望具有相同的项目表示?

javascript - jQuery Mobile 拆分按钮 clickEvent 无 ID

Javascript 在 Chrome Extension 中并不总是有效,我应该什么时候运行它?

语法

java - 将对象添加到 Java 集合时,是按值添加还是按引用添加?

java - 获取列表中的元素类型,其中列表是java中方法的返回类型

javascript - <a> 为 :hover or <div> with hover event for buttons?

javascript - 使用 JavaScript 识别独特的命中

c# - 您可以在 List<MyObject> 的位置 0 处插入吗?

internet-explorer - Adsense 广告未显示在 IE 中(IE浏览器)