4

これは、複数の属性でバックボーン コレクションをフィルタリングするための適切なアプローチですか?

filterData: function(params) {
    // store original data for clearing filters
    this.originalModels = this.models.slice();
    for (var key in params) {
        var val = params[key];
        // if we are dealing with multiple values in an array
        // i.e. ['ford','bmw','mazda']
        if (typeof val === "object") {
            var union = [];
            for (var k in val) {
                var subval = val[k];
                var matched = _.filter(this.models, function(house) {
                   return house.get(key) == subval; 
                });
                union = union.concat(matched);
            }
            this.models = union;
        } else {
           var results = _.filter(this.models, function(house) {
               return house.get(key) == val;
           });
           this.models = results;
        }
    } // end for
    return this.reset(this.models);
},
clearFilters: function() {
    return this.reset(this.originalModels);
}

テストしたところ、次の方法でコレクションをフィルタリングできます。

filterParams = {brand:['ford','bmw','mazda'], color:black}

carCollection.filterData(filterParams);

うまくいくようですが、これを行うより良い方法があるかどうかはわかりません。

メソッドをテストしましたBackbone.Collection.where()が、言いたい場合は機能しませんbrand: ['bmw','mazda','ford']

4

2 に答える 2

7

次のようなものを使用できるはずです。

filterData: function(params) {
    // store original data for clearing filters
    this.originalModels = this.models.slice();

    _.each(params, function(val, key){
        if (typeof val !== 'object') val = [ val ];
        this.models = _.filter(this.models, function(model){
            return _.indexOf(val, model.get(key)) !== -1;
        }, this);
    }, this);
    return this.reset(this.models);
}
于 2012-06-23T17:05:50.253 に答える
1

Backbone.js コレクションは、filter() を含む多数の underscore.js メソッドにアクセスできます。

carCollection.reset(carCollection.filter(function(car){
  return $.inArray(car.brand,['ford','bmw','mazda']) && car.color === 'black';
}));

テストされていませんが、jQuery を使用すると動作するはずです。そうでない場合は、独自の inArray() 関数を作成できます

于 2012-06-23T00:20:36.640 に答える