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 。
是否有人可以解决此问题?
答案 0 :(得分: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);
};