2011-05-27 90 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 }); 

這種方法使全局錯誤處理,而不需要擴展骨幹基類。