2013-01-22 75 views
1

我正在构建我的第一个Backbone应用程序,其结构与Todo MVC example类似,具有Require.js并且还使用Backbone LocalStorage。问题是,当我在HomeView运行TweetsCollection.fetch(),萤火给我的错误:TypeError: options is undefinedvar method = options.update ? 'update' : 'reset';Backbone.js收集提取错误

TweetsCollection:

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

}); 

HomeView的init:

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

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

我尝试按照上面的例子,但我真的迷失了。

回答

0

发生错误的代码行位于Backbone的success回调中,该回调由Backbone.sync执行。下面就是该方法看起来像骨干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); 
    }; 

此前0.9.10版本,骨干回调签名是:

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

Backbone.localStorage插件,你显然使用,executes the callback method as follows (line 146)

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

正如您所看到的,它不会按正确的顺序传递参数,并且缺少options a完全的参数,这是你看到错误的地方。

因此,似乎Backbone.localStorage插件目前与最新的Backbone版本不兼容。

编辑:我去报告这个问题给localStorage插件的作者,但看起来像已经有一个GitHub issue and pull request来解决这个问题。它尚未合并,所以在此期间,您可以使用phoey's fork或降级到Backbone 0.9.9

+0

谢谢!降级到0.9.9 – Potty