2013-02-24 184 views
0

我有一系列車輛範圍。每個範圍都有一組包含該範圍內模型的VehicleModel。即Backbonejs - 在模型中過濾集合

骨幹型號和款式:

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。即返回具有燃料屬性等於「汽油」的車輛模型的所有範圍。很容易的通過模型篩選集合屬性,如:

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

首先不把嵌套對象爲單獨的集合。他們只是陣列。

所以,當你這樣做:

this.model.get("VehicleModels")

你只會得到一個Array類型的對象,而不是一個Backbone.Collection

要過濾一個普通數組,你應該使用下劃線的filter方法。

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

+0

感謝您的答覆:我有以下: 模型= models.filter(功能(範圍){ 如果(_.where(range.get( 'VehicleModels'),{ '燃料' :params.fuel})長度> 0) 返回範圍; }); 很好奇,如果有更好的方法 – Chev 2013-02-24 17:06:23

+3

這是正確的,但你應該返回true或false而不是範圍對象。 'contains'在這裏不起作用 – neebz 2013-02-24 17:18:12