tabulator.js 中的复选框列选择问题

checkbox column selection issue in tabulator.js

我正在使用 Tabulator.js v4.2.7,我有一个 select 行的复选框列。此列 header 有一个 select/deselect 所有行的复选框。

这工作正常。但是在单击 header 复选框后,所有行都将被 selected,如果我取消选中任何行复选框,则 header 复选框不会被取消选中。

例如,如果我有 5 行,如果我单击 header 复选框,则所有 5 行都将被 select 编辑,现在如果我取消选中第二行复选框,剩下的 4 行仍将 [=需要取消选中 34=]ed 和 header 复选框。但是 header 复选框没有被取消选中。

这是我的复选框列代码:

{
    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();
        }
    }
}

请指出我做错的地方。

谢谢,

阿卜杜勒

经过几个小时的分析,我发现我哪里错了。我通过在 header 单击时为列中的所有单元格设置 cell.getData().IsSelected 来解决,并且还添加了逻辑以根据计数取消选中单元格单击中的 header 复选框。我也用香草 javascript 替换了 Jquery 代码这是答案:

这是工作片段

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>