2013-02-24 2 views
0

나는 Vehicle Ranges 컬렉션을 가지고 있습니다. 각 Range에는 해당 범위의 모델을 포함하는 VehicleModels의 배열이 있습니다. 즉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

우선 별도의 컬렉션으로 중첩 된 객체를 취급하지 않습니다. 그들은 단지 배열입니다.

그래서 당신이 할 때 당신은 단지 Array 유형의 객체가 아닌 Backbone.Collection을 얻을 것이다

this.model.get("VehicleModels")

.

일반 배열을 필터링하려면 밑줄의 filter 메서드를 사용해야합니다. 답장을

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

+0

감사 : 나는이 다음 모델 = models.filter (기능 (범위) { 경우 (_.where (range.get ('VehicleModels'), { '연료' : params.fuel}). 길이> 0) 반환 범위 }); 더 좋은 방법이 있다면 호기심이 있었습니까 – Chev

+3

이것은 정확하지만 range 객체 대신 true 또는 false를 반환해야합니다. '포함 '은 여기서 작동하지 않습니다. – neebz