2013-08-01 26 views
3

我是Backbone的新手,我对将(对象)JSON数组传递给Backbone集合时发生了什么感到困惑。将JSON数组传递给Backbone Collection时错误的collection.length

我从托管在Google云端硬盘上的电子表格中提取一些JSON。我正在解析这些数据,因为我想在我的集合中使用的实际数据是深深嵌套的。在我的解析函数中,如果我记录了我想要的数组的长度,我得到了157(这是正确的)。然后我将该数组传递给Backbone集合,并且我的集合的长度为1(不正确)。就好像foo.bar.length = 157,但'foo'中只有一个'bar',所以当我将foo.bar传入集合时,它需要foo.bar而不是foo.bar的内容!很困惑。下面

代码...

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":"..."}] 
} 

In a Fiddle http://jsfiddle.net/nikoshr/kHBvY/

请注意id属性是如何包装在对象中的"id":{"$t":"https://spreadsheets.google.com/feeds/list/0AjbU8ta9j916dFdjSVg3YkNPUUJnWkZSWjBDWmZab3c/1/public/basic/cokwr"}

主干集合不允许重复,并且根据它们的ID确定重复项。您的所有商品都被视为重复商品并合并为一个。如果你删除了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