datatables 服务端分页 添加多选框

背景: 项目使用 vue.js + datatables + jquery

需求: 在每行的前面加上 checkbox 然后实现多选 反选

遇到的问题: 

由于是服务端分页,查看下一页再返回上一页 之前的多选框的选中状态就不见了,看文档发现没有什么好的解决方法,官网给出的 demo 是没有全选反选的功能。只好自己下决心把这个功能实现!

写代码之前要考虑到几种场景:

1.切换页面 记住 checkbox 的选中状态

2.当前页面如果手动把所有的 checkbox 都选上了 那最上边的 checkbox 也要是选中的状态

3.一旦全选,取消任意一个 checkbox 的选中,那么 最上边的 checkbox 要取消选中

4.如果切换到当前的页面所有的 checkbox 都被选中了 那么 最上边的 checkbox 也要是选中的状态

5.点击全选,把未选中的 checkbox 选中

6.点击取消全选,肯定是因为上一步你的操作是全选上了,只需要把当页的数据从数组里移出去就好

ps:其实这六点注意,大多数都是对 全选按钮的状态控制

代码实现:

1> 记住 checkbox 的选中状态 回到该页 如果数据都被选中 全选框也为选中状态

selected 为存放选中值的数组

var table = $('#patients').on('xhr.dt', function ( e, settings, json, xhr ) {
              var flag = true
              let data = json.aData.map((d) => {return d.id})
              self.currentData = data
              for (let i = 0;i < data.length;i++) {
                if (self.selected.indexOf(data[i]) === -1) {
                  flag = false
                  break
                }
              }
              $(".checkall").prop("checked", flag)
          } ).DataTable({
复制代码

"rowCallback": function( row, data ) {
                if ( $.inArray(data.id, self.selected) !== -1 ) {
                    $(row).find('input[type=checkbox]').prop('checked', true)
                }
              },
              "aoColumns" : [ {
                "sClass": "text-center",
                 "data": "id",
                 "render": function (data, type, full, meta) {
                     return '<input type="checkbox" class="checkchild" value="' + data + '" />';
                 },
                 "bSortable": false
              }, 
复制代码

$("#patients").on("click", 'td input[type=checkbox]', function () {
            let checked = $(this).prop("checked")
            if (checked === true) {
              self.selected.push(this.value)
              //  如果页面上的 checkbox 全选上了 将 checkall 赋值为 true
              if ($(".checkchild:checked").length === self.currentData.length) {
                $(".checkall").prop("checked", true)
              }
            } else {
              //  一旦取消选中 则将全选按钮赋值为 false
              $(".checkall").prop("checked", false)
              let index = self.selected.indexOf(this.value)
              self.selected.splice(index, 1)
            }
            console.log(self.selected);
          });
复制代码

2> 点击全选 所有的 checkbox 为选中

这里我用到了两个方法:

1.将所有选中的从 selected 里去掉 然后再把当页数据添加到 selected 里

2.将所有未选中的 checkbox 的 value 添加到 selected 里

自我感觉 第二种方式会比较友好... (注释的代码是第一种方法)

ps:你之所有能点击取消全选,一定是你上一步把所有的 checkbox 都选中了,所以取消全选,只需要遍历当前页面数据从 selected 移出去即可

$(".checkall").click(function () {
              var checked = $(this).prop("checked")
              // 把当前页选中的从 selected 去掉 再全部 concat 进去
              if (checked === true) {
                $(".checkchild").not("input:checked").each(function () {
                  self.selected.push($(this)[0].value)
                })
                // self.currentData.map((data) => {
                //   self.selected.map((d) => {
                //     let index = self.selected.indexOf(data)
                //     if (index !== -1) {
                //       self.selected.splice(index, 1)
                //     }
                //   })
                // })
                // self.selected = self.selected.concat(self.currentData)
              } else {
                self.currentData.map((data) => {
                  let index = self.selected.indexOf(data)
                  self.selected.splice(index, 1)
                })
              }
              $(".checkchild").prop("checked", checked)
              console.log(self.selected);
          });
复制代码

目前测试没问题,大家有任何疑问欢迎提出!

ajax请求后的回调函数参考链接

row selection 参考链接

列添加 checkbox 参考链接

服务端处理参考链接


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以通过以下两种方式来设置DataTables大量分页: 1. 通过设置每页显示的记录条数来减少分页数。可以通过设置每页显示的记录条数,比如每页显示50条记录,来减少分页数。这样可以减少服务器端的负载,并提高页面加载速度。 2. 通过使用服务器端分页来实现。服务器端分页是将数据库中的所有记录一次性获取并存储在服务器内存中,然后根据需要分页显示记录。这样可以避免前端页面与服务器端的多次通信,降低服务器端的负载,提高页面加载速度。 请注意,以上两种方式需要根据实际的业务需求和数据量进行选择。如果数据量很大或者涉及到多表关联查询,那么使用服务器端分页会更加合适。如果数据量比较小,且分页查询比较频繁,那么就可以考虑使用前端分页。 ### 回答2: DataTables是一个常用的数据表格插件,用于在网页上展示和处理大量数据。要设置DataTables的大量分页,可以按照以下步骤进行: 1. 导入DataTables插件:在网页中引入DataTables的相关文件,包括CSS和JavaScript文件。 2. 创建一个HTML表格:在网页中创建一个HTML表格,用于展示数据。 3. 初始化DataTables:使用JavaScript代码初始化DataTables插件,并关联到HTML表格上。可以指定一些参数来配置DataTables的行为,比如分页大小、排序方式等。 4. 加载数据:根据需要,可以使用Ajax或其他方式加载大量的数据,并填充到HTML表格中。 5. 分页设置:根据需要,可以设置DataTables分页大小和显示页码的数量。分页大小定义了每页显示的数据条数,而显示页码的数量决定了页面下方的页码导航栏上可见的页码数量。 6. 自定义分页样式:可以自定义CSS样式来美化分页导航栏,使其更符合网页的设计风格。 7. 配置分页回调函数:DataTables提供了一些回调函数,可以在分页事件发生时执行自定义的处理逻辑。例如,可以在翻页时重新加载新的数据。 通过以上步骤,我们可以设置DataTables插件以处理大量数据分页展示需求。根据具体的情况,可以根据DataTables提供的参数和回调函数进行更高级的设置和定制。 ### 回答3: DataTables是一个用于处理大量数据JavaScript插件,它提供了丰富的功能和选项来进行数据分页。下面是一些设置DataTables进行大量分页的方法: 1. 分页器设置:使用`paging`选项来设置分页器的样式和显示。可以设置每页显示的记录数量,以及是否显示分页器。例如,通过将`paging: true`设置为`paging: false`,可以禁用分页器。 2. 分页模式设置:使用`pagingType`选项来设置分页模式。DataTables提供了多种分页模式,如简单数字导航、多页块以及滚动分页等。选择合适的分页模式可以提升用户体验。 3. AJAX分页:对于大量数据,可以使用Ajax加载数据,并通过`serverSide`选项将分页交由服务器处理。这样可以避免一次性加载大量数据,提高分页的性能和响应速度。 4. 自定义分页按钮:使用`pagingNumbers`选项可以自定义分页按钮的显示。你可以通过修改分页按钮模板来更改其样式或添加自定义的元素。 5. 页码跳转:可以使用`pagingType`选项的`input`值来在分页器中添加页码跳转输入框。用户可以在输入框中输入页码,然后按下回车键或单击跳转按钮来跳转到指定页。 6. 分页事件:DataTables提供了多个分页相关的事件,如`page`和`length`事件。你可以通过监听这些事件来执行自定义操作,如加载其他数据、更新页面元素等。 总的来说,要设置DataTables进行大量分页,需要根据具体的需求和情况来选择适当的配置选项,并可以利用其提供的丰富功能和事件来进行自定义操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值