0

車両範囲のコレクションがあります。各 Range には、その範囲内のモデルを含む VehicleModels の配列があります。すなわち

バックボーン モデルとコレクション:

App.Models.Range = Backbone.Models.extend({});
App.Collections.Ranges = Backbone.Collection.extend({
   model: Range
});

JSON:

[{
    "Name": "Range A",
    "VehicleModels": [
        {
            "Name": "1.2",
            "Fuel": "Petrol"
        },
        {
            "Name": "1.3",
            "Fuel": "Petrol"
        },
        {
            "Name": "1.6",
            "Fuel": "Petrol"
        }
    ]
},
{
    "Name": "Range B",
    "VehicleModels": [
        {
            "Name": "x1",
            "Fuel": "Diesel"
        },
        {
            "Name": "x2",
            "Fuel": "Diesel"
        },
        {
            "Name": "x3",
            "Fuel": "Diesel"
        }
    ]
}]

フィルター条件に一致する属性を持つ VehicleModels を持つよりも範囲を返すようにコレクションをフィルター処理するにはどうすればよいでしょうか。つまり、Fuel 属性が「Petrol」に等しい車両モデルを持つすべての範囲を返します。次のようなモデル属性でコレクションを簡単にフィルタリングできます。

filterByFuel: function(fuel){
   return this.models.where({'Fuel': fuel});
}

また

filterByFuel: function(fuel){
   return this.models.filter(function(vehicle) {
                     return vehicle.get('Fuel') === fuel;
                });
}

ただし、各 Range で VehicleModel コレクションを検索し、一致する場合はRangeを返す必要があります。

ヒントは大歓迎です。

編集

私はうまくいくように見える以下を持っていますが、もっと良い方法があるかどうか興味がありました. アンダースコアの「含む」機能は正しいように見えましたが、機能させることができませんでした:

 models = models.filter(function(range) {
                if (_.where(range.get('VehicleModels'), { 'Fuel': params.fuel }).length > 0)
                    return range;
            });
4

1 に答える 1

1

まず、Backbone はネストされたオブジェクトを個別のコレクションとして扱いません。それらは単なる配列です。

だからあなたがするとき:

this.model.get("VehicleModels")

Array型オブジェクトのみを取得し、 Backbone.Collection.

プレーン配列をフィルタリングするには、アンダースコアのfilter方法を使用する必要があります。

_.filter( this.model.get("VehicleModels"), function(mod) { /* your condition */ } );

于 2013-02-24T16:51:06.050 に答える