有没有办法为由backbone.js执行的ajax请求绑定一个错误处理程序?backbone.js ajax请求的全局错误处理程序
我的情况:我可以随时获得401(未授权),所以我需要显示登录弹出窗口。
有没有办法为由backbone.js执行的ajax请求绑定一个错误处理程序?backbone.js ajax请求的全局错误处理程序
我的情况:我可以随时获得401(未授权),所以我需要显示登录弹出窗口。
直接为此使用jQuery。
$(document).ajaxError(function (e, xhr, options) {
// do your stuff
});
您可以在rails for example(使用ajaxSend)中为CSRF做同样的事情。
你可以在这里阅读更多:http://api.jquery.com/jQuery.ajax#advanced-options
当发生错误时,主干的同步会触发'错误'事件。因此,您可以采用的一种方法是扩展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({
});
,你会做的集合对象类似的东西。我没有测试过上述内容,但认为它非常接近。显然,你会选择更好的类名。 init方法只是让子类有机会做自己的初始化。
模型真的应该处理401未授权吗? – Ben 2012-02-15 02:07:29
好问题。我们纯粹是因为模型和集合是我们服务器的渠道。它似乎不是传统上分配给模型类事物的责任,所以也许有更好的方法。早在五月,就没有太多的现有技术可以反思,所以这就是我们想出的方法。 – 2012-02-15 15:01:33
没有为我工作。 – 2012-10-17 18:56:36
我发现什么是可能的骨干“最正确的方式”:
var GeneralErrorView = Backbone.View.extend({
events: {
'ajaxError': 'handleAjaxError'
},
handleAjaxError: function (event, request, settings, thrownError) {
//...handling goes here
}
});
this.view = GeneralErrorView({el: document});
你可以把任何错误处理逻辑,而扩展型号或类别。利用处理程序中的Backbone.Events并将消息传递给其他错误处理程序或类似的东西。
聪明的做法! – 2013-07-24 17:02:55
这有效,但是当我从服务器收到500错误时,请求,设置,thrownError参数都是未定义的。如果我没有得到有关错误的信息,我无法真正使用此解决方案。我做错什么了吗? – 2014-11-26 14:34:30
这可能已经过时了,因为我近两年前使用过这个,你需要检查是否有任何东西传递给回调函数 – 2014-11-26 16:58:19
您可以通过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 });
这种方法使全局错误处理,而不需要扩展骨干基类。
请注意,此回调将针对所有jQuery ajax错误执行,而不仅仅是与骨干请求相关的错误。在页面中可能有其他库通过jQuery发出ajax请求,你可能不希望在这种情况下进行回调。 – cerberos 2013-04-11 13:14:25
hm,这太全球化了... – wik 2013-12-04 13:21:19
如果提取,同步,创建方法的回调函数提供了错误回调,则使用全局ajaxError回调的方法不适用于Backbone模型/集合。 – 2014-01-22 06:53:44