我有一个显示表格的模态。而且我使用datatable插件,以便数据可搜索和可排序。起初它正常工作,但是当我关闭模式并单击指向同一模式的其他链接时,它显示错误。我找到了销毁DataTable的解决方案,并destroy()在数据表初始化之前放置了,但是在表内部未显示任何数据..如果在初始化之后放置它,则第二次单击按钮时会出现初始化错误。我该如何解决?
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(); } });
销毁dataTables实例的主要原因是,如果您想更改初始化选项(例如change paging等)。或者是否应该更改表结构。这些情况似乎都不是这里吗?要回答这个问题,销毁和重新初始化表的最安全方法是使用简写选项destroy: true:
paging
destroy: true
var table = $('#records_table').DataTable({ ... destroy : true });
更进一步,我认为您正在做一些倒退。
$('#records_table tbody').empty();
table.clear()
$('#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在讨论引导程序模态。
assume
.modal-header
注意 :请注意$.parseJSON(response.contents),您应该像在问题中一样进行操作。这样做的唯一原因是示例通过代理来避免同源策略。
$.parseJSON(response.contents)