3

関数を使用しBackbone.Collection.whereてコレクションをフィルタリングすると、戻り値としてモデルの配列が取得されますが、他のフィルタリングされたコレクション オブジェクトは取得されません。そのため、他のコレクション関数を使用することはできません。

そのような行動の目的は何ですか?

4

2 に答える 2

6

whereを返す唯一のメソッドではありませんArray。既存のものを自動的に変更したくないのでwhere、 new を返します。また、多くの場合、結果を形式で表示したい場合があります。ArrayCollectionArray

何らかの理由で、BB 開発者は newArrayよりもnew を返す方が良いと判断しましたCollection。おそらく、返されたデータが別のタイプのCollection. もう 1 つの理由は、これらのメソッドの 1 つから何が返されるかを常に把握できるようにするためです。Arrays2 つ以上のタイプのコレクションは、これらのタイプのメソッドから常に返され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 から拡張します。

于 2012-12-25T14:58:04.360 に答える
0

配列では、ほとんどのアンダースコア ユーティリティを引き続き使用できることに注意してください。filter() の後に each() を使用する方法は次のとおりです。

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

于 2012-12-26T14:02:35.317 に答える