DataTable().ajax.reload()未定义

eCo*_*Evo 6 datatables jquery-datatables

我在DT v1.10下面有以下代码:

var oTable = $('#items')
    .dataTable({
        sDom: "<'row'<'col-md-4'l><'col-md-6'f>r>t<'row'<'col-md-4'i><'col-md-7'p>>",
        oLanguage: {
            sLengthMenu: "_MENU_ per page"
        },
        ajax: "/items",
        bProcessing: true,
        bServerSide: true,
        aoColumnDefs: [
            {
                aTargets: [-1],
                bSearchable: false,
                bSortable: false
            }
        ]
    })
    .on('click', '.btn-danger', function (e) {
        if (confirm('Are you sure you want to delete SKU "' + $(this).data('sku') + '"?')) {
            $.getJSON($(this).attr('href'), function (data) {
                if ('success' in data) {
                    oTable.ajax.reload(null, false);
                }
            });
        }
        event.stopPropagation();
        return false;
    });
Run Code Online (Sandbox Code Playgroud)

当服务器响应成功时,它会尝试调用该行,oTable.ajax.reload(null, false);但我总是得到错误Uncaught TypeError: Cannot read property 'reload' of undefined

我在这做错了什么?

Art*_*iak 21

您正在使用旧的API:$().dataTable()(v1.9及更早版本),它仍可在DataTables v1.10中使用.旧的API返回jQuery对象,因此您应该使用.api()以便使用DataTable API方法:

oTable.api().ajax.reload();
Run Code Online (Sandbox Code Playgroud)

新API通过以下方式返回: $().DataTable()

数据表常见问题

问:我收到一条错误消息,指出API方法不可用
A.:很可能您使用的是jQuery对象而不是DataTables API实例.表单$().dataTable()将返回一个jQuery对象,同时$().DataTable()返回一个DataTables API实例.有关详细信息,请参阅API文档.

API文档

需要注意的区别是很重要的$( selector ).DataTable()$( selector ).dataTable().前者返回DataTables API实例,后者返回jQueryJS对象.将一个api()方法添加到jQuery对象中,以便您可以轻松访问API,但jQuery对象可用于操作表节点,就像使用任何其他jQuery实例(例如使用addClass()等)一样.


dav*_*rad 8

作为phillip100答案的后续内容,您无需更改所有旧代码,也无需更改初始化方法以使用新API.您可以随时获取dataTables 1.10.x API:

...
if ('success' in data) {
  //oTable.ajax.reload(null, false);
  $('#items').DataTable().ajax.reload(null, false);
}
...
Run Code Online (Sandbox Code Playgroud)

也会非常好.jQuery dataTables检查是否已有dataTables实例$("#items"),因此不会有冗余.