我已经初始化了一个id 示例的数据表 -
var table = $("#example").DataTable({
"aaSorting": [[4, "asc"]],
select: true,
dom: 'Bfrtip',
buttons: [
'excelHtml5',
{
extend: 'pdfHtml5',
orientation: 'portrait',
pageSize: 'LEGAL'
},
{
extend: 'print',
pageSize: 'LEGAL',
title: 'Visible rows'
},
{
extend: 'selectAll',
className: 'selectall'
}
],
language: {
buttons: {
selectAll: "Select all rows"
}
}
});
当点击 selectAll 按钮时,我尝试使用以下代码搜索所有行后 -
table.on('search.dt', function (e) {
e.preventDefault();
$(".selectall").click(function (e) {
e.preventDefault();
var rows_after_search = table.rows({search: 'applied'}).nodes();
rows_after_search.each(function () {
$(this).toggleClass('selected');
});
});
});
此后我有点失落。 selectAll 仍在选择该页面上的所有行。
详细说明,假设Data-table的当前页面有10行。搜索后显示2行。现在我想在点击 selectAll 按钮时选择2行。
答案 0 :(得分:8)
{
extend: 'selectAll',
className: 'selectall',
action : function(e) {
e.preventDefault();
table.rows({ search: 'applied'}).deselect();
table.rows({ search: 'applied'}).select();
}
}
它不是简单地切换选择的类,而是调用方法' select()'这反过来使"取消选择全部"按钮并显示页脚文本,告诉您已选择了多少行。
答案 1 :(得分:7)
我相信您的一般问题是您没有重置取消选择(未过滤)的行。您只是为已过滤的行切换.selected
,最终会在所有选定的行中结束。此外,我会将代码放在action
方法中,因为您实际上覆盖了selectAll的默认功能。
{
extend: 'selectAll',
className: 'selectall',
action : function(e) {
e.preventDefault();
table.rows({ page: 'all'}).nodes().each(function() {
$(this).removeClass('selected')
})
table.rows({ search: 'applied'}).nodes().each(function() {
$(this).addClass('selected');
})
}
}
演示 - >的 https://jsfiddle.net/sqmz7z76/ 强>
答案 2 :(得分:1)
{
extend: 'selectAll',
className: 'selectall',
action : function(e) {
e.preventDefault();
table.rows({ search: 'applied'}).deselect();
table.rows({ search: 'applied'}).select();
}
}
这是新版本的解决方案
答案 3 :(得分:0)
h0dges的答案比davidkonrad更接近,但是如果没有应用过滤器,则会选择所有内容而不管当前页面(所以所有加载的记录,即使页面上只显示10条记录)。这是我能够提出的最好的整体方法。
{
extend: 'selectAll',
className: 'selectall',
action : function(e) {
e.preventDefault();
roleTable.rows({ page: 'current'}).select();
roleTable.rows({ search: 'removed'}).deselect();
}
}
这将选择当前页面上的所有记录,并删除先前使用搜索功能过滤掉的所有内容。