2011-05-09 3 views
14

나는 모델 모음과 모델에 대한 추가 정보가있는 backbone.js를 사용하여 상황이 발생합니다. 예를 들어, 금액 목록을 반환한다고 상상해보십시오. 수량 목록에는 각 모델과 관련된 수량이 있습니다. 각 금액의 단위가 항상 같다고 가정 해 보겠습니다. quarts. 그럼 난 다시 내 서비스에서 얻을 JSON 객체가 같은 것을 할 수 있습니다backbone.js 컬렉션에 메타 데이터 유지 및 로딩

{ 
    dataPoints: [ 
     {quantity: 5 }, 
     {quantity: 10 }, 
     ... 
    ], 
    unit : quarts 
} 

이제 백본 컬렉션은 기본적으로 컬렉션이 메타 데이터를 연관시키기위한 실제 메커니즘이 없지만,이 질문에 나에게 제안했다 : Setting attributes on a collection - backbone js 나는 .meta(property, [value]) 스타일 함수를 사용하여 컬렉션을 확장 할 수 있습니다. 이는 훌륭한 솔루션입니다. 그러나 자연스럽게 우리는 위와 같은 json 응답으로부터이 데이터를 깨끗하게 검색 할 수 있기를 바라고 있습니다.

Backbone.js는 url 속성과 함께 컬렉션의 모델 목록을 추출 할 위치를 지정할 수있는 parse(response) 함수를 제공합니다. 그러나 이미 사용 가능한 부분 기능을 제거하는 fetch()을 오버로드하지 않고보다 지능적인 기능을 만드는 방법을 알고 있습니다.

제 질문은 : fetch()을 오버로드하는 것보다 더 좋은 옵션이 있습니까 (달성하기 위해 수퍼 클래스 구현이라고 부릅니다).

감사

개인적으로

답변

22

, 나는 또 다른 Model 내부 Collection 포장 것, 다음과 같이, parse를 오버라이드 (override) :

var DataPointsCollection = Backbone.Collection.extend({ /* etc etc */ }); 
var CollectionContainer = Backbone.Model.extend({ 
    defaults: { 
     dataPoints: new DataPointsCollection(), 
     unit: "quarts" 
    }, 
    parse: function(obj) { 
     // update the inner collection 
     this.get("dataPoints").refresh(obj.dataPoints); 

     // this mightn't be necessary 
     delete obj.dataPoints; 

     return obj; 
    } 
}); 

Collection.refresh() 호출은 새 값으로 모델을 업데이트합니다. 이전에 제안 된대로 사용자 정의 meta 값을 콜렉션에 전달하면 해당 메타 값에 바인드 할 수 없게 될 수도 있습니다.

+0

를 호출하지 않습니다 parse와 같은 Models의 모든 속성을 재정의 할 수 있습니다. 컬렉션에 메타 데이터가 있어야 의미가있는 경우 메타 콜렉션 솔루션 인 IMO를 사용하여 '대역 외'로 이동하는 대신 Backbone이 제공하는 객체 구조에 메타 데이터를 반영 할 수 있습니다. – Stoive

+0

이것은 나에게 매우 합리적 인 것 같습니다. 이것의 핵심은 모델 객체와 컬렉션에서 parse/url/fetch를 재정의 할 수 있다는 것입니다. 고마워. – idbentley

+6

Collection.refresh()가 더 이상 사용되지 않으므로 대신 Collection.reset()을 사용하십시오. – JMWhittaker

0

이 메타 데이터는 컬렉션에 속하지 않습니다. 이름이나 코드의 다른 설명자에 속합니다. 코드에는 컬렉션이 석영 요소로 가득하다는 것을 선언적으로 알아야합니다. url은 석영 요소를 가리키며 이미 사용하고 있습니다. 당신이 정말이 데이터를 얻을해야하는 경우

var quartzCollection = new FooCollection(); 
quartzCollection.url = quartzurl; 
quartzCollection.fetch(); 

왜 그냥이 당신이 연결된 다른 게시물에있어 답을 모순 알고 있지만 컬렉션은하지

_.uniq(quartzCollecion.pluck("unit"))[0];

+0

유닛이 AJAX 호출보다 먼저 알려지지 않았습니다. 나는 콜렉션의 각 모델 객체가 유닛을 저장해야 할 필요가 있기 때문에'pluck'을 사용하지 않습니다. 응답의 크기는 메타 데이터로 한 번만 연결하는 것보다 큽니다.또한 의심스러운 작업을하는 데 상당한 오버 헤드가 있습니다. – idbentley

+0

@idbentley {dataPoints : ..., unit}이 모델 이었지만. 그것은 어느 것입니다. dataPoints가 컬렉션이라는 것입니다. 그러니 @Stoive 대답에 언급 된 것과 같이 취급하십시오. 또한 뽑기 작업은 그 비용이 아닙니다. 모델을 단위로 매핑합니다. – Raynos