Как добавить обработчик ошибок по умолчанию для всех моделей 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.

У кого-нибудь есть решение этой проблемы?

Ответ 1

Backbone использует вызовы метода jQuery AJAX по умолчанию. Вы можете подключиться к этому напрямую, вместо использования Магистральной сети:

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

Если это не дает вам то, что вы хотите, вы можете переопределить метод "выборки" в модели Backbone:


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