小编典典

如何破坏数据表的首次初始化(模态内的数据表)

ajax

我有一个显示表格的模态。而且我使用datatable插件,以便数据可搜索和可排序。起初它正常工作,但是当我关闭模式并单击指向同一模式的其他链接时,它显示错误。我找到了销毁DataTable的解决方案,并destroy()在数据表初始化之前放置了,但是在表内部未显示任何数据..如果在初始化之后放置它,则第二次单击按钮时会出现初始化错误。我该如何解决?

这是我的代码:

    $.ajax({
      url: "<?php echo site_url('admin/group/getMember')?>",
      type: 'POST',
      data: { 'groupID': id},
      dataType: 'JSON',
      success: function(result){
        $('#records_table tbody').empty();
        // $('#records_table').DataTable({
            // "bLengthChange": false,
            // "paging":false,
        // });
        $('.modal-header #hdrmsg').text(result[0].fname);
        var trHTML='';

         $.each(result, function (i, item) {
            trHTML += '<tr><td>' + item.fname + '</td><td>' + item.mname + '</td><td>' + item.lname + '</td></tr>';
        });
        $('#records_table tbody').append(trHTML);
        $('#records_table').DataTable({
            "bLengthChange": false,
            "paging":false,
        });
        $('#records_table').DataTable().fnDestroy();

      }

  });

阅读 296

收藏
2020-07-26

共1个答案

小编典典

销毁dataTables实例的主要原因是,如果您想更改初始化选项(例如change
paging等)。或者是否应该更改表结构。这些情况似乎都不是这里吗?要回答这个问题,销毁和重新初始化表的最安全方法是使用简写选项destroy: true

var table = $('#records_table').DataTable({
   ...
   destroy : true
});

更进一步,我认为您正在做一些倒退。

  • 为什么用jQuery $('#records_table tbody').empty();而不是清空表table.clear()
  • 为什么使用jQuery $('#records_table tbody').append(trHTML);而不是使用注入记录table.row.add([...])

这是一个类似于问题中的代码方案,每次显示模式时,它都会重新初始化dataTable而不会发生冲突:

var table;
$('#modal').on('show.bs.modal', function() {
   $.ajax({
      url: url,
      dataType: 'JSON',
      success: function(response) {
         var response = $.parseJSON(response.contents);

         //clear the table, if it exists
         if (table) table.clear();

         //reinitialise the dataTable   
         table = $('#records_table').DataTable({
           destroy: true,
           bLengthChange: false,
           paging: false
         });

         $.each(response, function(i, item) {
           console.log("inserting", item);
           table.row.add([
             item.name,
             item.position
           ]).draw();
         });
       }
    });
});

参见演示-> http://jsfiddle.net/bz958dxj/

但是,您实际上根本不需要破坏表,这只会降低性能:

//global table object
table = $('#records_table').DataTable({
   bLengthChange: false,
   paging: false
});

$('#modal').on('show.bs.modal', function() {
   $.ajax({
      url: url,
      dataType: 'JSON',
      success: function(response) {
         var response = $.parseJSON(response.contents);

         //clear the table
         table.clear();

         //insert data 
         $.each(response, function(i, item) {
           console.log("inserting", item);
           table.row.add([
             item.name,
             item.position
           ]).draw();
         });
       }
    });
});

演示-> http://jsfiddle.net/8mjke9ua/

注意 :我只是assume基于问题中的引用,.modal-header在讨论引导程序模态。

注意
:请注意$.parseJSON(response.contents),您应该像在问题中一样进行操作。这样做的唯一原因是示例通过代理来避免同源策略。

2020-07-26