问题
我想在我的应用程序中使用一个默认的错误处理程序来处理所有意外错误,但是有些时候(例如保存模型时)会有很多错误,因此我想以自定义方式处理它们,而不是显示一般错误错误页面。
我以前的解决方案
我的Backbone.sync
函数以前有这个功能:
if(options.error)
options.error(response)
else
app.vent.trigger('api:error', response) # This is the global event channel
但是,这不再起作用,因为主干总是包裹错误函数,因此它可以触发模型上的
error
事件。新解决方案1
我可以覆盖模型和集合上的
fetch
和save
方法,以包装options.error
并在上面放置代码,但这有点丑陋。新解决方案2
听模型上的
error
,虽然这不允许我重写默认错误处理程序。新解决方案3
传递一个自定义选项以禁用错误的全局触发,尽管如此,这还是多余的。
我错过了什么吗?有推荐的方法吗?
我可以补充一点,我使用的是他们git仓库中的最新版本,而不是他们主页中的最新版本。
最佳答案
您可以在覆盖的同步中执行此操作吗?这似乎完成了您之前所做的相同操作。
// error is the error callback you passed to fetch, save, etc.
var error = options.error;
options.error = function(xhr) {
if (error) error(model, xhr, options);
// added line below.
// no error callback passed into sync.
else app.vent.trigger('api:error', xhr);
model.trigger('error', model, xhr, options);
};
这段代码来自Backbone来源,我只添加了
else
行。编辑:
这不是最漂亮的解决方案,但可能对您有用。创建一个新的要使用的Model基类,而不是扩展Backbone.Model,对此进行扩展。
var Model = Backbone.Model.extend({
// override fetch. Do something similar for save, destroy.
fetch: function(options){
options = options ? _.clone(options) : {};
var error = options.error;
options.error = function(model, resp) {
if (error) error(model, resp);
else app.vent.trigger('api:error', resp);
};
return Backbone.Model.prototype.fetch.apply(this, [options]);
},
});
var MyModel = Model.extend({});
var model = new MyModel();
model.fetch(); // error will trigger 'api:error'
实际上,这可能总比覆盖
sync
更好。可能的替代方法是使用:http://api.jquery.com/ajaxError/。
但是这样,无论是否将错误回调传递给主干fetch/save/destroy,您都将收到错误。
关于backbone.js - 使用 Backbone 进行站点范围的错误管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14965815/