有沒有辦法爲由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