Javascript 如何从ajax/错误回调中刷新数据表?
我正在扩展DataTables默认值,如下所示:Javascript 如何从ajax/错误回调中刷新数据表?,javascript,jquery,datatables,Javascript,Jquery,Datatables,我正在扩展DataTables默认值,如下所示: $.extend(true, $.fn.dataTable.defaults, { lengthChange: false, deferRender: true, displayLength: 25, stateSave: false, serverSide: true, processing: true, ajax: { type: 'POST', erro
$.extend(true, $.fn.dataTable.defaults, {
lengthChange: false,
deferRender: true,
displayLength: 25,
stateSave: false,
serverSide: true,
processing: true,
ajax: {
type: 'POST',
error: function($xhr) {
if($xhr.status === 401) {
wxu.openLoginBox(function(data) {
// HELP: how can I get the DataTables object from this context?
});
} else {
wxu.notify({'text': "Could not load list", 'cssClass': 'error', timeout: 0});
}
}
}
});
有时用户会注销,然后当他们尝试更改页面或排序时,它只会永远显示“处理”。我可以通过查找401
错误响应(这是我的应用程序在您超时时发送的信息)来发现这一点,但是我不知道如何“刷新”数据表以使“处理”消息消失,以便您可以继续使用该应用程序
请注意,我正在扩展.js
文件中的默认值——我不知道此时DataTables将绑定到什么元素
如何从ajax/错误回调内部“修复”数据表?根据,ajax
可以是一个函数。它随表一起调用,可用于为表构造新的API对象。然后,您可以使用API方法获取处理元素(使用.dataTables\u processing
),或者使用其他可用的方法执行任何其他操作。具体地说,类似这样的方法应该有效:
{
"ajax": function (data, callback, settings) {
$.ajax({
type: "POST",
success: function (json) {
callback(json);
},
error: function ($xhr) {
if ($xhr.status === 401) {
var api = new $.fn.dataTable.Api(settings);
var container = api.table().container();
$(container).find('.dataTables_processing').hide();
}
}
});
}
}
我没有看到它的具体文档,但是调用时,this
也被设置为ajax
函数中的DataTable对象。使用它可以更直接地达到你的目标,但我认为上面的内容更符合你的预期用途
注释
您不应该重写ajax.error
,因为这个属性是由DataTables内部使用的,这同样适用于ajax.success
解决方案
您可以为事件添加事件处理程序来处理Ajax错误(json==null
)
//防止显示警报消息
$.fn.dataTable.ext.errMode='none';
//使用委托事件处理程序
//处理Ajax请求完成事件
$(document.body).on('xhr.dt',函数(e,settings,json,xhr){
//如果出现Ajax错误且状态代码为401
如果(json==null&&xhr.status==401){
var api=new$.fn.dataTable.api(设置);
log(“会话已过期”);
/*
openLoginBox(函数(数据){
api.ajax.reload();
});
*/
}否则{
log('无法加载列表');
/*
通知({'text':“无法加载列表”,“cssClass':'error',超时:0});
*/
}
});
演示
有关代码和演示,请参阅。我认为这可能有问题。我仍然需要根据每个实例设置ajax URL。如果我默认
ajax
为函数,那么我将失去对内部属性的访问。如果你像普通一样通过初始化选项传入ajax.url
,它应该设置为函数的属性,并且可以通过api使用进行检索。我原以为这样可以,但我刚刚尝试过——因为我扩展了默认值,当我用{data:{url:'xxx'}}
初始化数据表时,它覆盖了整个函数。它永远不会被调用。你可以使用@Gyrocode.com建议的错误
事件侦听器,然后按照我在回答中提到的方式访问处理元素?是的,这看起来是唯一的方法,除了扩展。稍后我可能会对此进行研究,因为我不喜欢将事件处理程序绑定到document.body。