2014-09-29 5 views
1

나는 아주 기본적인 것을 놓치고 있다고 확신한다. 나는 '기본값'속성이 포함 된 모델을 기반으로 가져온 객체Backbone.js 내 기본 모델이 가져온 컬렉션에있는 이유는 무엇입니까?

collection.fetch({reset: true})

의 컬렉션을 설정하고있다.

그러나 콘솔에서 가져온 컬렉션을 볼 때 기본 속성으로 설정된 추가 모델이 있습니다. 왜 이런 일이 일어나는 걸까요? 더 중요한 것은 어떻게 그것을 막을 수 있습니까? 여기

var diningApp = diningApp || {}; 

(function(){ 
"use strict"; 

diningApp.MenuItem = Backbone.Model.extend({ 
    defaults: { 
     service_unit: null, 
     course: null, 
     formal_name: null, 
     meal: null, 
     portion_size: null, 
     service_unit_id: null 
    } 
}); 

var MenuCollection = Backbone.Collection.extend({ 
    model: diningApp.MenuItem, 

    url: '/api/dining/get_menus', 

    parse: function(response){ 
     return response.menu_items; 
    } 
}); 

diningApp.menuCollection = new MenuCollection(); 
diningApp.menuCollection.fetch({reset: true}); 
})(); 

은 서버에서 JSON 응답의 일부입니다 :

{ 
    "status": "ok", 
    "menu_items": [ 
    { 
    "service_unit": "Faculty House", 
    "course": "Entrees", 
    "formal_name": "Local CF Fried Eggs GF", 
    "meal": "BREAKFAST", 
    "portion_size": "1 Egg", 
    "service_unit_id": 0 
    }, 
    { 
    "service_unit": "Faculty House", 
    "course": "Entrees", 
    "formal_name": "CageFree Scrambled Eggs GF", 
    "meal": "BREAKFAST", 
    "portion_size": "2 eggs", 
    "service_unit_id": 0 
    }] 
} 

을 그리고 여기에 콘솔의 결과 모음입니다 :

enter image description here

+1

을 청소하기 parse 방법을 제거하려면 서버 응답을 수정 무엇'/ API에서 JSON을한다/dining/get_menus'는 (는) 어떻게 생겼습니까? –

+0

JSON 응답을 포함하도록 수정되었습니다. – lancemonotone

+3

@lancemonotone http://jsfiddle.net/nikoshr/cjd7syoh/ 제공된 샘플 데이터와 함께 작동하는 것 같습니다. 전체 JSON 어딘가에 정의되지 않은/빈/null 요소가 있습니까? http://jsfiddle.net/nikoshr/cjd7syoh/1/ – nikoshr

답변

1

것은 당신이에 조금 파고 경우 Backone의 소스 코드는 컬렉션을 재설정 할 때 어떤 일이 발생하는지 확인하기 위해 Collection.set으로 끝납니다. 문제에 대한 관심의 라인은 다음과 같습니다

// Turn bare objects into model references, 
// and prevent invalid models from being added. 
for (i = 0, l = models.length; i < l; i++) { 
    attrs = models[i] || {}; 
    // ... 

이 배열의 각 falsy (거짓, 널 (null) 등) 항목이 모델 및 수신 기본 값으로 캐스팅되기 전에 빈 객체로 변환되는 것을 의미한다.

어느

  • 는 falsy 값
  • 또는 변경하면 배열

    parse: function(response){ 
        return _.compact(response.menu_items); 
    } 
    
+0

_.compact는 좋은 해결책입니다. 개발자가 항상 서버 응답을 제어 할 가능성이 없으므로 백본의 이러한 동작을 광고해야한다고 생각합니다. 어쨌든, 도와 줘서 고마워. 매우 감사. – lancemonotone