1

我正在使用 Require.js 构建我的第一个 Backbone 应用程序,其结构与Todo MVC 示例类似,并且还使用 Backbone LocalStorage。问题是当我TweetsCollection.fetch()在 HomeView 中运行时,萤火虫给了我错误:TypeError: options is undefined var method = options.update ? 'update' : 'reset';

推文集合:

    define([
    'underscore',
    'backbone',
    'backboneLocalStorage',
    'models/TweetModel'
], function(_, Backbone, Store, TweetModel) {

'use strict';

    var TweetsCollection = Backbone.Collection.extend({

        model: TweetModel,

        localStorage: new Store('tweets-storage'),

        initialize: function() {
            console.log('Collection init...');
        }

    });

    return new TweetsCollection();

});

主页视图初始化:

initialize: function() {
            this.listenTo(TweetsCollection, 'add', this.addOne);
            this.listenTo(TweetsCollection, 'reset', this.addAll);
            this.listenTo(TweetsCollection, 'all', this.render);

            TweetsCollection.fetch(); // <- Error here
        },

我尝试按照上面的示例进行操作,但我真的迷失了。

4

1 回答 1

0

发生错误的代码行在 Backbone 的success回调中,由Backbone.sync. 这是该方法在 Backbone 中的样子0.9.10

  options.success = function(collection, resp, options) {
    var method = options.update ? 'update' : 'reset';
    collection[method](resp, options);
    if (success) success(collection, resp, options);
  };

在 version 之前0.9.10,Backbone 回调签名是:

options.success = function(resp, status, xhr) { ...

Backbone.localStorage您显然正在使用的插件执行回调方法如下(第 146 行)

  if (options && options.success)
    options.success(resp);

如您所见,它没有以正确的顺序传递参数,并且完全丢失了options参数,这是您看到错误的地方。

所以看起来 Backbone.localStorage 插件目前与最新的 Backbone 版本不兼容。

编辑:我去向 localStorage 插件的作者报告这个问题,但看起来已经有一个GitHub 问题和拉取请求来解决这个问题。它还没有合并,所以在此期间你可以使用phoey 的 fork或降级到 Backbone 0.9.9

于 2013-01-22T15:01:45.813 回答