我继承了一个使用Yajra DataTables在页面中显示网格内容的Laravel应用程序。
如果Laravel的会话到期,DataTable将抛出以下警告:
DataTables警告:table id = dataTableBuilder - Ajax错误。有关此错误的详细信息,请参阅http://datatables.net/tn/7
在Chrome中查看“网络”标签显示,DataTable的AJAX响应是401 Unauthorized。这是所有预期的行为,但我不想向用户显示任意错误,而是希望将用户发送到登录页面,并显示一条消息,说明"您的会话超时,请再次登录。 "什么的。
我无法弄清楚如何做到这一点。
传统的DataTables集成允许我将错误处理程序传递给AJAX响应(即{ajax: { error: function () {...} }}
),但似乎没有办法用Laravel DataTables来做到这一点。
Laravel DataTables有一个html()
方法,我可以这样覆盖:
public function html() {
return $this->builder()
->ajax([
error => ''
]);
}
但构建器上的ajax
方法不允许我将JavaScript处理程序传递给error属性。
当会话超时时,无论如何都要完成强制登录吗?
答案 0 :(得分:1)
鉴于上面的评论链,我的建议是在错误响应中添加一个唯一的字符串,如:
code: 401
然后,使用全局$.ajaxError
来捕获错误,并根据响应文本执行不同的操作:
$( document ).ajaxError(function( event, jqxhr, settings, thrownError ) {
if (typeof settings === "string" && settings.indexOf('401') > -1) {
//you can probably do something here
}
});
您甚至可以以更有效的方式执行此操作,因为401
响应类型应该可以在4个属性中的一个中观察到(不记得哪个)
答案 1 :(得分:0)
对DataTables更具体的选项(不需要全局覆盖)是使用$.fn.dataTable.ext.errMode
的函数
$.fn.dataTable.ext.errMode = function (settings, tn, msg) {
if (settings && settings.jqXHR && settings.jqXHR.status == 401) {
// Handling for 401 specifically
}
// Handling for all other errors, this implements the DataTables default
// behavior of throwing an alert
alert(msg)
};