4

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

当我打电话collection.fetch()时,当 json 中有 13 个对象时,我只返回 1 的长度。

我查看了parse:function(response)我在 Collection 中重写的方法,它返回了所有 13 个对象。我查看了backbone.js 中的add 方法,问题似乎出现在第591 行:

models = _.isArray(models) ? models.slice() : [models];

当我用 console.log 换行来检查模型变量的状态时:

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();
4

1 回答 1

2

显然,谷歌日历为其条目提供了一个包含在对象1中的 id :

"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。


编辑:问题来自于通过alt=json-in-script将属性包装在对象中的直接 XML 到 JSON 转换(通过参数请求)返回数据的方式。更改此参数以alt=jsonc生成更简单的 JSON 表示。将jsonc 输出等效的 json-in-script进行比较。

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

于 2012-06-26T15:12:57.420 回答