Backbonejs - 过滤模型中的集合

时间:2013-02-24 16:44:00

标签: backbone.js underscore.js

我有一系列车辆范围。每个Range都有一个VehicleModel数组,其中包含该范围内的模型。即。

Backbone Model and Collection:

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"
        }
    ]
}]

如何过滤集合以返回范围,而不是具有与过滤条件匹配的属性的VehicleModel。即返回所有具有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;
                });
}

但需要在每个范围内搜索VehicleModel集合,如果匹配则返回范围

提示非常感谢。

修改

我有以下似乎有效,但如果有更好的方法,我很好奇。下划线“包含”功能似乎是正确的,但无法让它起作用:

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

1 个答案:

答案 0 :(得分:1)

首先,Backbone不会将嵌套对象视为单独的集合。它们只是数组。

所以当你这样做时:

this.model.get("VehicleModels")

您只会获得Array类型的对象,而不是Backbone.Collection

要过滤普通数组,您应该使用下划线的filter方法。

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

相关问题