2011-11-04 290 views
25

我有一種情況,我正在管理區域中的各種Ext Grid面板等向服務器發送ajax請求。如果沒有任何活動,登錄的用戶將被註銷。這是正常的5分鐘。在這種情況下,服務器將重定向403發送回登錄頁面。 現在我插入:EXTJS 4 - 全局異常監聽器

listeners:{ 
    exception: function(proxy, response, operation, eOpts) { 
     if(response.status == '403') 
     window.location = 'login'; 
    } 
} 

到每個商店的代理是有點矯枉過正。
有人可能會友好,讓我知道我怎麼可以添加一個監聽器到ExtJS和服務器之間的所有通信?我正在使用MVC應用程序體系結構,因此它可能是controller.js或app.js中的單線程。謝謝

回答

28

在您的應用程序的開始插入以下片段。有了這個EVERY響應,無論是來自商店還是表單或...,都會被檢查並重定向到登錄頁面。

Ext.Ajax.on('requestexception', function (conn, response, options) { 
    if (response.status === 403) { 
     window.location = 'login'; 
    } 
}); 
+1

更多細節很有趣,我們都在同一時間都在回答這個問題並且都給出了相同的答案。所以它必須是正確的。 – nightwatch

+0

牛眼!非常感謝你 –

+0

不錯,非常感謝 – pylover

7

我真的不知道這是否會趕上所有的Ajax請求,但假設你使用AjaxProxy與服務器的所有通信它應該工作: 處理的正是Ext.Ajax的「requestexception」事件 像這樣

Ext.Ajax.on('requestexception', function(conn, response, options, eOpts) { 
    //your error handling here 
}); 

我還沒有嘗試過,但如果你這樣做,你能在這裏發佈的更新?

+0

@Sascha,nightwatch感謝你們倆。它工作正常。 – user798612

6

的更完整的解決方案,其特徵在於,這將是一個全捕獲是這樣的:

Ext.util.Observable.observe(Ext.data.Connection, { 
    requestexception: function(conn, response, options) { 
     if(response.status == '403') 
      window.location = 'login'; 
    } 
}); 

這是因爲底層類,Ext.data.Connection不僅用於在Ext.Ajax但還有Ext.data.Proxy使用該通過Ext.data.Store, Ext.data.Model。這將處理例如store.load()model.save()等呼叫的例外情況。這應該是一個更完整的通用處理程序。

my blog post.

+0

Ext.util.Observable.observe不是Ext JS 5.x中的函數。你必須使用Ext.Ajax.on – jprism

+0

不,你不需要,而且在Ext JS 5.0.1中'typeof Ext.util.Observable.observe'會輸出''function「'' – EricLavault