是否可以为backbone.js执行的ajax请求绑定一个错误处理程序?
我的情况:我可以随时获得401(未经授权),所以我需要显示登录弹出窗口。
答案 0 :(得分:25)
Backbone的同步会在发生错误时触发'错误'事件。因此,您可以采用的一种方法是扩展Backbone的Model和Collection对象,以添加这些附加错误检查。它看起来像这样:
ErrorHandlingModel = Backbone.Model.extend({
initialize: function(attributes, options) {
options || (options = {});
this.bind("error", this.defaultErrorHandler);
this.init && this.init(attributes, options);
},
defaultErrorHandler: function(model, error) {
if (error.status == 401 || error.status == 403) {
// trigger event or route to login here.
}
}
});
OtherModel = ErrorHandlingModel.extend({
});
你会为Collection对象做类似的事情。我没有测试过上面的内容,但认为它非常接近。显然,你会选择更好的类名。 init方法只是让子类有机会进行自己的初始化。
答案 1 :(得分:24)
直接使用jQuery。
$(document).ajaxError(function (e, xhr, options) {
// do your stuff
});
你可以在rails for rails中为CSRF做同样的事情(使用ajaxSend)。
您可以在此处阅读更多内容:http://api.jquery.com/jQuery.ajax#advanced-options
答案 2 :(得分:15)
我发现的可能是Backbone中“最正确的方式”:
var GeneralErrorView = Backbone.View.extend({
events: {
'ajaxError': 'handleAjaxError'
},
handleAjaxError: function (event, request, settings, thrownError) {
//...handling goes here
}
});
this.view = GeneralErrorView({el: document});
您可以放置任何错误处理逻辑,而无需扩展模型或集合。在处理程序中使用Backbone.Events并将消息传递给其他错误处理程序或类似的东西。
答案 3 :(得分:10)
您可以通过jQuery .ajaxSetup方法处理此问题。我们有一个相同的情况(骨干应用程序,可能随时得到401错误),我们通过在我们的应用程序的入口点使用jQuery的ajaxSetup来处理它:
var appView = new AppView(options);
$.ajaxSetup({
cache: false,
statusCode: {
401: function () {
appView.signIn();
}
}
});
appView.render();
Backbone.history.start({ root: config.rootUrl, pushState: true });
此方法提供全局错误处理,无需扩展Backbone基类。