3

当我使用该Backbone.Collection.where函数过滤集合时,我得到一个模型数组作为返回值,而不是其他过滤的集合对象。所以我不能使用其他收集功能。

这种行为的目的是什么?

4

2 回答 2

6

where不是唯一返回Array. where返回一个新的Array,因为你绝对不希望它Collection自动改变你现有的。此外,很多时候您可能想要Array形式的结果。

无论出于何种原因,BB 开发人员决定返回一个新的Array而不是一个新的更好Collection。一个想法可能是,返回的数据可能会用于不同类型的Collection. 另一个原因可能是您始终知道其中一种方法返回的内容。2+ 类型的集合将始终Arrays从这些类型的方法返回,而不必尝试检查 viainstanceof或其他不太可靠的方法。

编辑

此外,您可以使您的集合以您返回 new 的方式运行Collections。创建一个基本集合来执行以下操作:

// Override the following methods
var override = ["where","find",...];
var collectionProto = Backbone.Collection.prototype;
BaseCollection = Backbone.Collection.extend({});
for (var key in collectionProto) {
    if (collectionProto.hasOwnProperty(key) && override.indexOf(key) > -1) {
        BaseCollection.prototype[key] = function () {
            return new this.constructor(collectionProto[key].apply(this, arguments);
        };
    }
}

而是过度扩展 Backbone.Collection,扩展 BaseCollection。

于 2012-12-25T14:58:04.360 回答
0

请注意,您仍然可以在数组上使用大多数下划线实用程序。这是在 filter() 之后使用 each() 的方法

_.each(MyCollection.filter(filter_fn() {}), each_fn() {})

于 2012-12-26T14:02:35.317 回答