Javascript 如何从ajax/错误回调中刷新数据表?

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

我正在扩展DataTables默认值,如下所示:

$.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。