【问题标题】:Destroy and recreate a jQuery Datatables销毁并重新创建 jQuery 数据表
【发布时间】:2018-05-08 13:09:55
【问题描述】:

我有两个带有服务器端处理的 jQuery 数据表。我有一个复选框,可以在其中隐藏和显示两个表格。我想销毁没有显示的并创建另一个表。我该怎么做?

这是我尝试过的,但 ajax.reload 没有触发。

if ($('#mode').is(':checked')) {
    Table2.ajax.reload();
    Table1.clear();
    Table1.destroy();
} else {
    Table1.ajax.reload();
    Table2.clear();
    Table2.destroy()
}

var Table1 = $('#timesheet-table').DataTable({})
var Table2 = $('#timesheet-table-2').DataTable({})

【问题讨论】:

  • Table1 和 Table2 对象是什么?引用我假设的表的 JS 变量?
  • 我更新了帖子
  • 我猜 Table1 和 Table2 的初始化超出了 if/else 的范围...?也许将console.log(Table); 放在每个块中,看看它引用了什么......?
  • 默认情况下,我初始化 Table1,而不是在选中的第二个 #timesheet-table-2 上给一个 id
  • @fefe 你能试试这个吗:jsbin.com/ququfutufi/edit?html,output

标签: jquery datatables create-table destroy


【解决方案1】:

在我看来,您永远不会在页面中显示 2 个数据表,所以为什么不只使用一个。 你可以初始化你的数据表并使用这样的序列

table.destroy();
$('#myTable').empty();
table = $('#myTable').DataTable( {
        columns: json.columns,
        data:    json.rows
});

根据需要重新创建它。

【讨论】:

  • 是的,但在每张桌子上我都有不同的列
  • columns: json.columns 将允许您按定义更改列。我期待这样的事情。看到这个:datatables.net/forums/discussion/30947/…
  • 到目前为止,解决方案似乎是正确的,但我无法更改列
  • @fefe,如果这是一个解决方案(仅使用一个表),那么您可以跳过 ajax.reload() 想法并改用 jQuery ajax,然后在您之前动态构建 columns 列表(重新)初始化表...
【解决方案2】:

您可以尝试一个简单的解决方法并重新加载页面,并在查询字符串中传递一个标志或其他内容,以告知您要加载哪个数据表。

通过重新加载页面,您将重置 DOM 并实质上破坏之前加载的任何表。

例如:

$(document).ready( function {

var flag = getUrlVars()["flag"];

if(flag != 1) {

      Table2 = $('#timesheet-table-2').DataTable({})

} else {

      Table1 = $('#timesheet-table').DataTable({})

}

}


function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

【讨论】:

    【解决方案3】:

    您可以尝试这样的事情(这里有一个fiddle 可能会有所帮助):

    function loadDataTable(type) {
      $('#dataTableDiv').empty();
      $('#dataTableDiv').append('<table cellpadding="0" cellspacing="0" border="0" class="dataTable table table-striped" id="example"> </table>');
    
      var table1_columnList = [{
        "data": "otherId",
        "title": "Other ID"
      }, {
        "data": "firstName",
        "title": "First Name"
      }, {
        "data": "lastName",
        "title": "Last Name"
      }, {
        "data": "gender",
        "title": "Gender"
      }];
    
      var table2_columnList = [{
        "data": "id",
        "title": "ID"
      }, {
        "data": "firstName",
        "title": "First Name"
      }, {
        "data": "lastName",
        "title": "Last Name"
      }, {
        "data": "gender",
        "title": "Gender"
      }, {
        "data": "dob",
        "title": "DOB"
      }, {
        "data": "race",
        "title": "Race"
      }];
    
      var columnList = "";
    
      if (type == 'table1')
        columnList = table1_columnList;
      else
        columnList = table2_columnList;
    
    
      myTable = $('#example').DataTable({
        "sPaginationType": "full_numbers",
        data: datavar,
        columns: columnList,
        responsive: true,
      });
    
    }
    

    【讨论】:

      【解决方案4】:

      据此:https://datatables.net/reference/api/ajax.reload()ajax.reload() 它只是用于从远程流重新加载数据表的数据,而不是重新加载数据表本身

      我认为你必须这样做:

      if($('#mode').is(':checked')) {
      
        Table2 = $('#timesheet-table-2').DataTable({})
        Table1.clear();
        Table1.destroy();
      
      } else {
        Table1 = $('#timesheet-table').DataTable({})
        Table2.clear();
        Table2.destroy()
      }
      
      
      
      var Table1 = $('#timesheet-table').DataTable({})
      var Table2 = $('#timesheet-table-2').DataTable({})
      

      【讨论】:

        【解决方案5】:

        您必须清除 div 内容才能正确销毁

         if($('#mode').is(':checked')) {
              Table2 = $('#timesheet-table-2').DataTable({})
              Table1.clear();
              Table1.destroy();
              $('#timesheet-table').empty();
        } 
        
        else {
          Table1 = $('#timesheet-table').DataTable({})
          Table2.clear();
          Table2.destroy();
          $('#timesheet-table-2').empty();
        }
        

        【讨论】:

          【解决方案6】:
          if ($('#mode').is(':checked')) {
              Table2.ajax.reload();
              Table1.clear();
              Table1.destroy();
          } else {
              Table1.ajax.reload();
              Table2.clear();
              Table2.destroy()
          }
          
          var Table1 = $('#timesheet-table').DataTable({
              ajax: "data.json";
          })
          var Table2 = $('#timesheet-table-2').DataTable({
              ajax: "data.json";
          })
          

          您需要提供ajax url才能使用table.ajax.reload()方法

          【讨论】:

            【解决方案7】:

            就我而言,要重置表格,我只需这样做:

            $('#table_id').DataTable().clear().destroy();
            $('#table_id').empty();
            

            这样您就可以将表重置回其初始状态,然后您可以重新初始化它。

            【讨论】:

            • 这在重新初始化数据表时给了我一个错误,可能是因为表头也被删除了。所以我用$('#table_id').find("tbody").empty();代替了$('#table_id').empty();,现在一切运行良好。
            猜你喜欢
            • 2015-09-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多