2011-11-04 194 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