Backbone.js只创建第一个模型,然后在使用Google Calendar解析时将其余模型返回为undefined

使用Backbone从Google日历中提取日历事件时遇到一些问题.

当我调用collection.fetch()时,我只返回1的长度,当json中有13个对象时.

我看一下我正在覆盖Collection的parse:function(response)方法,它返回所有13个对象.我查看了backbone.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 Calendar Feed,所以我担心我遗漏了一些非常简单的东西.

如果我在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日历为其条目提供了一个包含在对象1中的ID:

"id":{
    "$t":"http://www.google.com/calendar/feeds/..."
}

哪个Backbone似乎不喜欢.很多.

一个简单的解决方案是覆盖解析方法中的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 outputjson-in-script equivalent进行比较.

有关详细信息,请参阅https://developers.google.com/youtube/2.0/developers_guide_jsonc#Comparing_JSON_and_JSONC

点赞