11

背景:

Backbone 模型提供了一个选项来注册一个回退错误处理程序,每次调用服务器失败时都会调用该处理程序,并且没有提供特定的处理程序。

MyModel = new Backbone.Model.extend({
  initialize: function(option) {
    this.on("error", this.fallbackErrorHandler);
  },

  fallbackErrorHandler: function() {
    // default behavior in case of an error
  },

  foo: function() {
    this.fetch();             // fallbackErrorHandler will be called
    this.fetch({              // the inline error handler will be called
      error: function() {
        // some specific code for this error
      }
    });
  }    
});

我想做的事:

我希望我的应用程序中的所有主干模型都有一个回退错误处理程序。但是 - 我不想为每个模型显式添加处理程序。 我想定义和注册一次处理程序,并将其应用于我的应用程序中的每个主干模型。此外,我不想更改现有代码,也不想更改开发人员在我的应用程序中定义模型的方式。

我已经尝试过的:

我添加了一个初始化程序,它在Backbone.Model.prototype对象上注册了一个处理程序。

App.Marionette.addInitializer(function() {
  Backbone.Model.prototype.on("error",function(){
     // default behavior in case of an error
  });
});

此代码有效,并且调用了我的后备错误处理程序。但是,此代码的副作用是在应用程序的任何主干模型中注册的所有错误处理程序都注册在Backbone.Model.prototype上而不是Backbone.Model上。所以显然这不是一个好的解决方案。

我还考虑定义MyModel扩展Backbone.Model并注册默认处理程序。然后,我的应用程序中的所有其他模型将扩展MyModel,而不是直接扩展 Backbone.Model。但是,我试图无缝地做到这一点,而不必更改现有代码,然后指示所有开发人员扩展MyModel而不是Backbone.Model

有没有人有这个问题的解决方案?

4

1 回答 1

6

Backbone 默认使用 jQuery 的 AJAX 方法调用。您可以直接连接到这个,而不是使用 Backbone:

http://api.jquery.com/ajaxError/

如果这不能满足您的需求,您可以覆盖 Backbone 模型中的“fetch”方法:


var originalFetch = Backbone.Model.prototype.fetch;

Backbone.Model.prototype.fetch = function(options){

  var originalError = options.error;

  options.error = function(model, error){
    if (originalError){ originalError(model, error); }

    // call your global error handler here.
    App.myGlobalErrorHandler(model, error);

  }

  originalFetch.apply(this, arguments);
};
于 2012-12-02T20:02:08.897 回答