[英]checkbox column selection issue in tabulator.js
I'm using Tabulator.js v4.2.7 and I have a checkbox column to select rows. 我正在使用Tabulator.js v4.2.7,并且具有一个复选框列来选择行。 This column header has a checkbox to select/deselect all rows. 该列标题具有一个复选框,用于选择/取消选择所有行。
This is working fine. 一切正常。 But after clicking header checkbox all rows will be selected and if I uncheck any row checkbox then header checkbox is not getting unchecked. 但是在单击标题复选框后,所有行都将被选中,如果我取消选中任何行复选框,则标题复选框不会被取消选中。
Example, if I have 5 rows and if I click header checkbox the all 5 rows will be selected and now if I uncheck 2nd row checkbox remaining 4 rows will still be selected and header checkbox needs to be unchecked. 例如,如果我有5行,并且单击“标题”复选框,则将选择所有5行,现在,如果我取消选中“第二行”复选框,则仍将选择剩余的4行,并且需要取消选中“标题”复选框。 But header checkbox is not getting unchecked. 但是标题复选框不会被取消选中。
Here is my code for checkbox column: 这是我的复选框列代码:
{
title: 'Select <br/> All <br/> <input type="checkbox" class="select-all-row" aria-label="select all rows" />',
field: 'IsSelected',
formatter: function(cell, formatterParams, onRendered) {
return '<input type="checkbox" class="select-row" aria-label="select this row" />';
},
width: 50,
headerSort: false,
headerFilter: false,
cssClass: 'text-center',
frozen: true,
tooltips: false,
resizable: false,
cellClick: function(e, cell) {
var $element = $(cell.getElement());
var $chkbox = $element.find('.select-row');
if (cell.getData().IsSelected) {
cell.getRow().deselect();
} else {
cell.getRow().select();
}
$chkbox.prop('checked', !cell.getData().IsSelected);
cell.getData().IsSelected = !cell.getData().IsSelected;
},
headerClick: function(e, column) {
if (column.getTable().getSelectedRows().length !== column.getTable().getDataCount()) {
$('.select-row,.select-all-row').prop('checked', true);
column.getTable().selectRow();
} else {
$('.select-row,.select-all-row').prop('checked', false);
column.getTable().deselectRow();
}
}
}
please assist on where I'm doing wrong. 请协助我做错了。
Thanks, 谢谢,
Abdul 阿卜杜勒
After analyzing for few hours I found where I was wrong. 经过几个小时的分析,我发现我错了。 I resolved by setting the cell.getData().IsSelected
for all cells in the column on header click and also added logic to uncheck header checkbox in cell click based on count. 我通过为标题单击列中的所有单元格设置cell.getData().IsSelected
来解决,并且还添加了逻辑以根据计数取消选中单元格单击中的标题复选框。 Also I have replaced Jquery code with vanilla javascript Here is the answer: 我也用香草javascript替换了Jquery代码这是答案:
Here is the working snippet 这是工作片段
var tabledata = [{ id: 1, name: "Oli Bob", progress: 12, location: "United Kingdom", gender: "male", rating: 1, col: "red", dob: "14/04/1984", car: 1, lucky_no: 5, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 2, name: "Mary May", progress: 1, location: "Germany", gender: "female", rating: 2, col: "blue", dob: "14/05/1982", car: true, lucky_no: 10, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 3, name: "Christine Lobowski", progress: 42, location: "France", gender: "female", rating: 0, col: "green", dob: "22/05/1982", car: "true", lucky_no: 12, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 4, name: "Brendon Philips", progress: 100, location: "USA", gender: "male", rating: 1, col: "orange", dob: "01/08/1980", car: false, lucky_no: 18, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 5, name: "Margret Marmajuke", progress: 16, location: "Canada", gender: "female", rating: 5, col: "yellow", dob: "31/01/1999", car: false, lucky_no: 33, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 6, name: "Frank Harbours", progress: 38, location: "Russia", gender: "male", rating: 4, col: "red", dob: "12/05/1966", car: 1, lucky_no: 2, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 7, name: "Jamie Newhart", progress: 23, location: "India", gender: "male", rating: 3, col: "green", dob: "14/05/1985", car: true, lucky_no: 63, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 8, name: "Gemma Jane", progress: 60, location: "China", gender: "female", rating: 0, col: "red", dob: "22/05/1982", car: "true", lucky_no: 72, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 9, name: "Emily Sykes", progress: 42, location: "South Korea", gender: "female", rating: 1, col: "maroon", dob: "11/11/1970", car: false, lucky_no: 44, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 10, name: "James Newman", progress: 73, location: "Japan", gender: "male", rating: 5, col: "red", dob: "22/03/1998", car: false, lucky_no: 9, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 11, name: "Oli Bob", progress: 12, location: "United Kingdom", gender: "male", rating: 1, col: "red", dob: "14/04/1984", car: 1, lucky_no: 5, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 12, name: "Mary May", progress: 1, location: "Germany", gender: "female", rating: 2, col: "blue", dob: "14/05/1982", car: true, lucky_no: 10, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 13, name: "Christine Lobowski", progress: 42, location: "France", gender: "female", rating: 0, col: "green", dob: "22/05/1982", car: "true", lucky_no: 12, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 14, name: "Brendon Philips", progress: 100, location: "USA", gender: "male", rating: 1, col: "orange", dob: "01/08/1980", car: false, lucky_no: 18, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 15, name: "Margret Marmajuke", progress: 16, location: "Canada", gender: "female", rating: 5, col: "yellow", dob: "31/01/1999", car: false, lucky_no: 33, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 16, name: "Frank Harbours", progress: 38, location: "Russia", gender: "male", rating: 4, col: "red", dob: "12/05/1966", car: 1, lucky_no: 2, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 17, name: "Jamie Newhart", progress: 23, location: "India", gender: "male", rating: 3, col: "green", dob: "14/05/1985", car: true, lucky_no: 63, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 18, name: "Gemma Jane", progress: 60, location: "China", gender: "female", rating: 0, col: "red", dob: "22/05/1982", car: "true", lucky_no: 72, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 19, name: "Emily Sykes", progress: 42, location: "South Korea", gender: "female", rating: 1, col: "maroon", dob: "11/11/1970", car: false, lucky_no: 44, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 20, name: "James Newman", progress: 73, location: "Japan", gender: "male", rating: 5, col: "red", dob: "22/03/1998", car: false, lucky_no: 9, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 21, name: "Oli Bob", progress: 12, location: "United Kingdom", gender: "male", rating: 1, col: "red", dob: "14/04/1984", car: 1, lucky_no: 5, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 22, name: "Mary May", progress: 1, location: "Germany", gender: "female", rating: 2, col: "blue", dob: "14/05/1982", car: true, lucky_no: 10, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 23, name: "Christine Lobowski", progress: 42, location: "France", gender: "female", rating: 0, col: "green", dob: "22/05/1982", car: "true", lucky_no: 12, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 24, name: "Brendon Philips", progress: 100, location: "USA", gender: "male", rating: 1, col: "orange", dob: "01/08/1980", car: false, lucky_no: 18, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 25, name: "Margret Marmajuke", progress: 16, location: "Canada", gender: "female", rating: 5, col: "yellow", dob: "31/01/1999", car: false, lucky_no: 33, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 26, name: "Frank Harbours", progress: 38, location: "Russia", gender: "male", rating: 4, col: "red", dob: "12/05/1966", car: 1, lucky_no: 2, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 27, name: "Jamie Newhart", progress: 23, location: "India", gender: "male", rating: 3, col: "green", dob: "14/05/1985", car: true, lucky_no: 63, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 28, name: "Gemma Jane", progress: 60, location: "China", gender: "female", rating: 0, col: "red", dob: "22/05/1982", car: "true", lucky_no: 72, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 29, name: "Emily Sykes", progress: 42, location: "South Korea", gender: "female", rating: 1, col: "maroon", dob: "11/11/1970", car: false, lucky_no: 44, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 30, name: "James Newman", progress: 73, location: "Japan", gender: "male", rating: 5, col: "red", dob: "22/03/1998", car: false, lucky_no: 9, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 31, name: "Oli Bob", progress: 12, location: "United Kingdom", gender: "male", rating: 1, col: "red", dob: "14/04/1984", car: 1, lucky_no: 5, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 32, name: "Mary May", progress: 1, location: "Germany", gender: "female", rating: 2, col: "blue", dob: "14/05/1982", car: true, lucky_no: 10, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 33, name: "Christine Lobowski", progress: 42, location: "France", gender: "female", rating: 0, col: "green", dob: "22/05/1982", car: "true", lucky_no: 12, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 34, name: "Brendon Philips", progress: 100, location: "USA", gender: "male", rating: 1, col: "orange", dob: "01/08/1980", car: false, lucky_no: 18, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 35, name: "Margret Marmajuke", progress: 16, location: "Canada", gender: "female", rating: 5, col: "yellow", dob: "31/01/1999", car: false, lucky_no: 33, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 36, name: "Frank Harbours", progress: 38, location: "Russia", gender: "male", rating: 4, col: "red", dob: "12/05/1966", car: 1, lucky_no: 2, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 37, name: "Jamie Newhart", progress: 23, location: "India", gender: "male", rating: 3, col: "green", dob: "14/05/1985", car: true, lucky_no: 63, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 38, name: "Gemma Jane", progress: 60, location: "China", gender: "female", rating: 0, col: "red", dob: "22/05/1982", car: "true", lucky_no: 72, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 39, name: "Emily Sykes", progress: 42, location: "South Korea", gender: "female", rating: 1, col: "maroon", dob: "11/11/1970", car: false, lucky_no: 44, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 40, name: "James Newman", progress: 73, location: "Japan", gender: "male", rating: 5, col: "red", dob: "22/03/1998", car: false, lucky_no: 9, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 41, name: "Oli Bob", progress: 12, location: "United Kingdom", gender: "male", rating: 1, col: "red", dob: "14/04/1984", car: 1, lucky_no: 5, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 42, name: "Mary May", progress: 1, location: "Germany", gender: "female", rating: 2, col: "blue", dob: "14/05/1982", car: true, lucky_no: 10, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 43, name: "Christine Lobowski", progress: 42, location: "France", gender: "female", rating: 0, col: "green", dob: "22/05/1982", car: "true", lucky_no: 12, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 44, name: "Brendon Philips", progress: 100, location: "USA", gender: "male", rating: 1, col: "orange", dob: "01/08/1980", car: false, lucky_no: 18, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 45, name: "Margret Marmajuke", progress: 16, location: "Canada", gender: "female", rating: 5, col: "yellow", dob: "31/01/1999", car: false, lucky_no: 33, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 46, name: "Frank Harbours", progress: 38, location: "Russia", gender: "male", rating: 4, col: "red", dob: "12/05/1966", car: 1, lucky_no: 2, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 47, name: "Jamie Newhart", progress: 23, location: "India", gender: "male", rating: 3, col: "green", dob: "14/05/1985", car: true, lucky_no: 63, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 48, name: "Gemma Jane", progress: 60, location: "China", gender: "female", rating: 0, col: "red", dob: "22/05/1982", car: "true", lucky_no: 72, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 49, name: "Emily Sykes", progress: 42, location: "South Korea", gender: "female", rating: 1, col: "maroon", dob: "11/11/1970", car: false, lucky_no: 44, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, { id: 50, name: "James Newman", progress: 73, location: "Japan", gender: "male", rating: 5, col: "red", dob: "22/03/1998", car: false, lucky_no: 9, lorem: "Lorem ipsum dolor sit amet, elit consectetur adipisicing " }, ]; var table = new Tabulator("#example-table", { data: tabledata, columns: [{ title: 'Select <br/> All <br/> <input type="checkbox" class="select-all-row" aria-label="select all rows" />', field: 'IsSelected', formatter: function(cell, formatterParams, onRendered) { return '<input type="checkbox" class="select-row" aria-label="select this row" />'; }, width: 50, headerSort: false, headerFilter: false, cssClass: 'text-center', frozen: true, tooltips: false, resizable: false, cellClick: function(e, cell) { var element = cell.getElement(); var chkbox = element.querySelector('.select-row'); if (cell.getData().IsSelected) { cell.getRow().deselect(); document.querySelector('.select-all-row').checked = false; } else { cell.getRow().select(); if (cell.getColumn().getTable().getSelectedRows().length === cell.getColumn().getTable().getDataCount()) { document.querySelector('.select-all-row').checked = true; } } chkbox.checked = !cell.getData().IsSelected; cell.getData().IsSelected = !cell.getData().IsSelected; }, headerClick: function(e, column) { if (column.getTable().getSelectedRows().length !== column.getTable().getDataCount()) { document.querySelectorAll('.select-row,.select-all-row').forEach(cb => cb.checked = true); column.getTable().selectRow(); } else { document.querySelectorAll('.select-row,.select-all-row').forEach(cb => cb.checked = false); column.getTable().deselectRow(); } column.getCells().forEach(cell => cell.getData().IsSelected = !cell.getData().IsSelected); } }, { title: "Name", field: "name", width: 200 }, { title: "Progress", field: "progress", width: 100, align: "right", sorter: "number" }, { title: "Gender", field: "gender", width: 100 }, { title: "Rating", field: "rating", align: "center", width: 80 }, ], });
<link href="https://cdnjs.cloudflare.com/ajax/libs/tabulator/4.2.7/css/tabulator.min.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/tabulator/4.2.7/js/tabulator.min.js"></script> <div id="example-table"></div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.