4

Backbone を使用して Google カレンダーからカレンダー イベントを取得する際に問題が発生しました。

私が呼び出すcollection.fetch()と、jsonに13個のオブジェクトがある場合、長さ1しか返されません。

コレクションでオーバーライドしているメソッドを確認したところ、parse:function(response)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 カレンダー フィードを正常に解析したことがあるので、本当に単純なものが欠けているのではないかと心配しています。

Iconsole.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

どうやら、Google カレンダーはエントリにオブジェクト1でラップされた ID を提供します。

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

バックボーンが嫌いなようです。多くの。

簡単な解決策の 1 つは、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 に答える