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