当我使用该Backbone.Collection.where函数过滤集合时,我得到一个模型数组作为返回值,而不是其他过滤的集合对象。所以我不能使用其他收集功能。
这种行为的目的是什么?
当我使用该Backbone.Collection.where函数过滤集合时,我得到一个模型数组作为返回值,而不是其他过滤的集合对象。所以我不能使用其他收集功能。
这种行为的目的是什么?
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。
请注意,您仍然可以在数组上使用大多数下划线实用程序。这是在 filter() 之后使用 each() 的方法
_.each(MyCollection.filter(filter_fn() {}), each_fn() {})