【问题标题】:How to manually update datatables table with new JSON data如何使用新的 JSON 数据手动更新数据表
【发布时间】:2023-03-02 22:34:01
【问题描述】:

我正在使用插件 jQuery datatables 并加载我在页面底部的 DOM 中加载的数据并以这种方式启动插件:

var myData = [
    {
        "id": 1,
        "first_name": "John",
        "last_name": "Doe"
    }
];

$('#table').dataTable({
    data: myData
        columns: [
        { data: 'id' },
        { data: 'first_name' },
        { data: 'last_name' }
    ]
});

现在。执行一些操作后,我想使用 ajax 获取新数据(但不是在数据表中构建 ajax 选项 - 不要误会我的意思!)并用这些数据更新表。我如何使用数据表 API 做到这一点?文档非常混乱,我找不到解决方案。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 删除现有的tablebody并创建新的怎么样?

标签: jquery datatables jquery-datatables


【解决方案1】:

解决方案:(注意:此解决方案适用于数据表版本 1.10.4(目前)而非旧版本)。

澄清根据API documentation (1.10.15),API 可以通过三种方式访问​​:

  1. DataTables 的现代定义(大写驼峰式):

    var datatable = $( selector ).DataTable();

  2. DataTables 的旧版定义(小写驼峰式):

    var datatable = $( selector ).dataTable().api();

  3. 使用new 语法。

    var datatable = new $.fn.dataTable.Api( selector );

然后像这样加载数据:

$.get('myUrl', function(newDataArray) {
    datatable.clear();
    datatable.rows.add(newDataArray);
    datatable.draw();
});

数据更新后使用draw(false)保持在同一页面上。

API 参考:

https://datatables.net/reference/api/clear()

https://datatables.net/reference/api/rows.add()

https://datatables.net/reference/api/draw()

【讨论】:

  • 这个太难找了,非常感谢!使用它在服务器往返之间持久化数据表。
  • datatables 1.9.4 版怎么样,我也面临同样的问题
  • 我只想补充一点,您还可以链接方法(即datatable.clear().rows.add(newDataArray).draw())。截至此评论,我使用的是 1.10.18 版
【解决方案2】:

你可以使用:

$('#table').dataTable().fnClearTable();
$('#table').dataTable().fnAddData(myData2);

Jsfiddle

更新。是的,目前的文档不是很好,但如果你可以使用旧版本,你可以参考legacy documentation

【讨论】:

  • 是的,你是对的,但我使用的是最新版本的数据表。无论如何,我找到了解决方案并更新了我的问题。感谢您的关注:)
  • @CookieMan,请删除您的编辑并将其作为答案发布。之后,将其标记为已接受。
  • 此解决方案不更新分页部分
  • 这很棒。谢谢
【解决方案3】:

你需要销毁旧的数据表实例,然后重新初始化数据表

首先使用$.fn.dataTable.isDataTable检查数据表实例是否存在

如果存在则销毁它,然后像这样创建新实例

    if ($.fn.dataTable.isDataTable('#dataTableExample')) {
        $('#dataTableExample').DataTable().destroy();
    }

    $('#dataTableExample').DataTable({
        responsive: true,
        destroy: true
    });

【讨论】:

    【解决方案4】:

    这是旧数据表 1.9.4 的解决方案

        var myData = [
          {
            "id": 1,
            "first_name": "Andy",
            "last_name": "Anderson"
          }
       ];
        var myData2 = [
          {
            "id": 2,
            "first_name": "Bob",
            "last_name": "Benson"
          }
        ];
    
      $('#table').dataTable({
      //  data: myData,
           aoColumns: [
             { mData: 'id' },
             { mData: 'first_name' },
             { mData: 'last_name' }
          ]
      });
    
     $('#table').dataTable().fnClearTable();
     $('#table').dataTable().fnAddData(myData2);
    

    【讨论】:

    • 这适用于最新版本(请考虑评论的日期)。谢谢你维卡斯!
    • 这对我有用。但我不明白为什么我可以使用所有这些示例: var datatable = $( selector ).DataTable(); var datatable = $( 选择器 ).dataTable().api(); var datatable = new $.fn.dataTable.Api( 选择器 );但是当添加 .row().add() 不起作用。
    【解决方案5】:

    在我的例子中,我没有使用内置的 ajax api 将 Json 提供给表(这是由于在数据表的渲染回调中很难实现的一些格式)。

    我的解决方案是在 onload 函数和处理数据刷新的函数(例如var table = null)的外部范围内创建变量。

    然后我在加载方法中实例化我的表

    $(function () {
                //.... some code here
                table = $("#detailReportTable").DataTable();
                .... more code here
            });
    

    最后,在处理刷新的函数中,我调用 clear() 和 destroy() 方法,将数据提取到 html 表中,然后重新实例化数据表,如下所示:

    function getOrderDetail() {
                table.clear();
                table.destroy();
                ...
                $.ajax({
                 //.....api call here
                });
                ....
                table = $("#detailReportTable").DataTable();
       }
    

    我希望有人觉得这很有用!

    【讨论】:

    • 每次往返都销毁整个表是相当昂贵的,而且状态也会丢失。您应该考虑保留表格状态的已接受答案。
    猜你喜欢
    • 2014-01-27
    • 2021-12-04
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多