関数を使用しBackbone.Collection.where
てコレクションをフィルタリングすると、戻り値としてモデルの配列が取得されますが、他のフィルタリングされたコレクション オブジェクトは取得されません。そのため、他のコレクション関数を使用することはできません。
そのような行動の目的は何ですか?
関数を使用しBackbone.Collection.where
てコレクションをフィルタリングすると、戻り値としてモデルの配列が取得されますが、他のフィルタリングされたコレクション オブジェクトは取得されません。そのため、他のコレクション関数を使用することはできません。
そのような行動の目的は何ですか?
where
を返す唯一のメソッドではありませんArray
。既存のものを自動的に変更したくないのでwhere
、 new を返します。また、多くの場合、結果を形式で表示したい場合があります。Array
Collection
Array
何らかの理由で、BB 開発者は newArray
よりもnew を返す方が良いと判断しましたCollection
。おそらく、返されたデータが別のタイプのCollection
. もう 1 つの理由は、これらのメソッドの 1 つから何が返されるかを常に把握できるようにするためです。Arrays
2 つ以上のタイプのコレクションは、これらのタイプのメソッドから常に返されinstanceof
ます。
編集
さらに、 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() {} )