使用Backbone从Google日历提取日历事件时遇到一些问题。
当我调用collection.fetch()
时,当json中有13个对象时,返回的长度仅为1。
我看了我在Collection中重写的parse:function(response)
方法,它返回了所有13个对象。我看了骨干.js中的add方法,问题似乎发生在第591行:
models = _.isArray(models) ? models.slice() : [models];
当我用console.log换行以检查models变量的状态时:
console.log(models);
models = _.isArray(models) ? models.slice() : [models];
console.log(models);
我得到以下结果:
[Object,Object,Object,Object,Object,Object,Object,Object,Object,Object,Object,Object,Object] backbone.js:590
[child,undefined × 12]
我不知为何要解释为什么添加失败。我已经通过更改集合中的
parse:function(response)
方法以返回每个对象来检查每个模型,并且工作正常。parse: function(response) {
return response.feed.entry[5];
}
之前,我已经使用Backbone.js成功解析了Google日历供稿,因此我担心缺少一些非常简单的东西。
如果我
console.log
response.feed
返回以下内容:这是完整的课程:
/**
* Backbone
* @class
*/
var Gigs = Gigs || {};
Gigs.Backbone = {}
Gigs.Backbone.Model = Backbone.Model.extend();
Gigs.Backbone.Collection = Backbone.Collection.extend({
model: Gigs.Backbone.Model,
url: 'http://www.google.com/calendar/feeds/email@email.com/public/full?alt=json-in-script&orderby=starttime&callback=?',
sync: function(method, model, options) {
options.dataType = "jsonp";
return Backbone.sync(method, model, options);
},
parse: function(response) {
return response.feed.entry;
}
});
Gigs.Backbone.Controller = Backbone.View.extend({
initialize: function() {
var self = this;
this.collection = new Gigs.Backbone.Collection();
this.collection.on('reset', this.addElements, this);
this.collection.fetch();
},
addElements: function() {
log(this.collection);
}
});
var backbone = new Gigs.Backbone.Controller();
最佳答案
显然,Google日历为其条目提供的ID包裹在对象1中:
"id":{
"$t":"http://www.google.com/calendar/feeds/..."
}
骨干似乎不喜欢它。很多。
一种简单的解决方案是覆盖您的parse方法中的id:
parse: function(response) {
var entries=[];
_.each(response.feed.entry, function(entry,ix) {
entry.id=entry.id.$t;
entries.push(entry);
});
return entries;
}
和小提琴http://jsfiddle.net/bqzkT/
1检查https://developers.google.com/gdata/docs/json以查看Google如何将其XML数据转换为JSON。
编辑:问题来自将数据以直接XML到JSON转换(通过
alt=json-in-script
参数请求)返回的方式,将属性包装在对象中。将此参数更改为alt=jsonc
会产生更简单的JSON表示形式。将jsonc output与json-in-script equivalent进行比较。有关更多信息,请参见https://developers.google.com/youtube/2.0/developers_guide_jsonc#Comparing_JSON_and_JSONC