我是Backbone的新手,当我将JSON数组(对象)传递给Backbone Collection时,我对发生的事情感到非常困惑。
我从Google云端硬盘上托管的电子表格中获取了一些JSON。我正在解析那些数据,因为我想要在我的集合中使用的实际数据是深度嵌套的。在我的解析函数中,如果我记录了我想要的数组的长度,我得到157(这是正确的)。然后我将该数组传递给Backbone Collection,我的集合长度为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 :(得分:3)
如果您转储Google Spreadsheets返回的其中一项,您会看到数据嵌套在多个对象中,如下所示
{
"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"}
Backbone集合不允许重复,并且重复根据其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/演示
您可能需要打开所有属性才能以非拔毛的方式使用它们。