2013-08-01 3 views
3

저는 백본을 처음 사용하기 때문에 객체의 JSON 배열을 백본 컬렉션에 전달할 때 상황에 대해 매우 혼란 스럽습니다.JSON 배열을 백본 컬렉션에 전달할 때 collection.length가 잘못되었습니다.

Google 드라이브에서 호스팅되는 스프레드 시트에서 일부 JSON을 가져옵니다. 내 컬렉션에서 사용하려는 실제 데이터가 깊이 중첩되어 있으므로 해당 데이터를 구문 분석합니다. 내 구문 분석 함수에서 원하는 배열의 길이를 기록하면 157이됩니다. 그런 다음 해당 배열을 백본 컬렉션으로 전달하고 컬렉션의 길이는 1 (올바르지 않음)입니다. 마치 foo.bar.length = 157이지만 'foo'에는 'bar'가 하나만 있으므로 foo.bar를 콜렉션에 전달할 때 foo.bar가 필요하고 foo.bar의 내용은 필요하지 않습니다! 매우 혼란. 아래

코드 ... 당신이 Google 스프레드 시트에 의해 반환 된 항목 중 하나를 덤프 경우

var table = new TableView(); 

TableItem = Backbone.Model.extend(), 

TableItemCollection = Backbone.Collection.extend({ 
    model : TableItem, 
    url : 'https://spreadsheets.google.com/feeds/list/0AjbU8ta9j916dFdjSVg3YkNPUUJnWkZSWjBDWmZab3c/1/public/basic?alt=json-in-script', 
    sync : function(method, model, options) { 
     var params = _.extend({ 
      type: 'GET', 
      dataType: 'jsonp', 
      url: this.url, 
      processData: false 
     }, options); 
     return $.ajax(params); 
    }, 
    parse : function(resp, xhr) { 
     console.log(resp.feed.entry.length); // THIS LOGS 157 
     return resp.feed.entry; 
    } 
}), 

TableView = Backbone.View.extend({ 
    initialize : function (options) { 
     this.collection = new TableItemCollection(); 
     this.collection.on('reset', this.parseResponse, this); 
     this.collection.fetch({ 
      reset : true, 
      success : function (model, response, options) { 
       console.log('OK'); // THIS LOGS 'OK' 
      }, 
      error : function (model, response, options) { 
       console.log('ERROR'); 
      } 
     }); 
    }, 
    parseResponse : function() { 
     console.log(this.collection.length); // THIS LOGS 1 
    } 
}); 
+0

'resp.feed.entry'의 타입은 배열인지 확실합니까? 구문 분석 메소드'console.log (_. isArray (resp.feed.entry))'에서 로그 아웃하십시오! – nemesv

답변

3

, 당신은 데이터가 여러 개체에 중첩되는 것을 볼 수 있습니다,이

{ 
    "id":{"$t":"https://spreadsheets.google.com/feeds/list/..."}, 
    "updated":{"$t":"2013-07-30T12:01:24.000Z"}, 
    "category":[{"scheme":"...","term":"..."}], 
    "title":{"type":"text","$t":"ACIW"}, 
    "content":{}, 
    "link":[{"rel":"self","type":"application/atom+xml","href":"..."}] 
} 

같은 바이올린에서 http://jsfiddle.net/nikoshr/kHBvY/

id 속성이 개체에 래핑 된 방법에 유의하십시오. "id":{"$t":"https://spreadsheets.google.com/feeds/list/0AjbU8ta9j916dFdjSVg3YkNPUUJnWkZSWjBDWmZab3c/1/public/basic/cokwr"}

백본 모음은 중복을 허용하지 않으며 복제본은 해당 ID를 기반으로 결정됩니다. 모든 항목은 중복으로 간주되어 하나의 항목으로 축소됩니다. ID를 제거하거나 명확히하면 157 개의 항목을 얻을 수 있습니다. 데모

예를 들어,

parse : function(resp, xhr) { 
    var data = resp.feed.entry, i; 
    console.log(data.length); // THIS LOGS 157 

    for (i=data.length-1; i>=0; i--) 
     data[i].id = data[i].id['$t']; 

    return data; 
} 

http://jsfiddle.net/nikoshr/kHBvY/2/를 들어 당신은 아마이 아닌 머리 당기는 방식으로 사용하는 모든 속성 랩을 해제해야합니다.

+0

물론! 고마워요. 총체적인 이해가됩니다. * 페이스 팔 * – user2641989