2011-05-27 75 views

回答

24

直接为此使用jQuery。

$(document).ajaxError(function (e, xhr, options) { 
    // do your stuff 
}); 

您可以在rails for example(使用ajaxSend)中为CSRF做同样的事情。

你可以在这里阅读更多:http://api.jquery.com/jQuery.ajax#advanced-options

+7

请注意,此回调将针对所有jQuery ajax错误执行,而不仅仅是与骨干请求相关的错误。在页面中可能有其他库通过jQuery发出ajax请求,你可能不希望在这种情况下进行回调。 – cerberos 2013-04-11 13:14:25

+1

hm,这太全球化了... – wik 2013-12-04 13:21:19

+3

如果提取,同步,创建方法的回调函数提供了错误回调,则使用全局ajaxError回调的方法不适用于Backbone模型/集合。 – 2014-01-22 06:53:44

25

当发生错误时,主干的同步会触发'错误'事件。因此,您可以采用的一种方法是扩展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方法只是让子类有机会做自己的初始化。

+4

模型真的应该处理401未授权吗? – Ben 2012-02-15 02:07:29

+0

好问题。我们纯粹是因为模型和集合是我们服务器的渠道。它似乎不是传统上分配给模型类事物的责任,所以也许有更好的方法。早在五月,就没有太多的现有技术可以反思,所以这就是我们想出的方法。 – 2012-02-15 15:01:33

+0

没有为我工作。 – 2012-10-17 18:56:36

15

我发现什么是可能的骨干“最正确的方式”:

var GeneralErrorView = Backbone.View.extend({ 
    events: { 
    'ajaxError': 'handleAjaxError' 
    }, 
    handleAjaxError: function (event, request, settings, thrownError) { 
    //...handling goes here 
    } 
}); 

this.view = GeneralErrorView({el: document}); 

你可以把任何错误处理逻辑,而扩展型号或类别。利用处理程序中的Backbone.Events并将消息传递给其他错误处理程序或类似的东西。

+0

聪明的做法! – 2013-07-24 17:02:55

+0

这有效,但是当我从服务器收到500错误时,请求,设置,thrownError参数都是未定义的。如果我没有得到有关错误的信息,我无法真正使用此解决方案。我做错什么了吗? – 2014-11-26 14:34:30

+0

这可能已经过时了,因为我近两年前使用过这个,你需要检查是否有任何东西传递给回调函数 – 2014-11-26 16:58:19

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 }); 

这种方法使全局错误处理,而不需要扩展骨干基类。