Bootstrap Table 实现 分页选中

1. 支持分页选中,当前页选中、下一页选中等等数组叠加

注:该方式无法做到点击第一页选中全部页数据。支持当前页全选/选几行,下一页再点击全选/选几行,数组内容会叠加。

代码:

columns: [{
		checkbox : true,   // 增加复选框
        formatter : function (value, row, index) {
            if ($.inArray(row.id, selectAllIds) !== -1) {
                return {
                    checked: true  // 设置选中
                }
            }
        }
	}
]
...

$('#bootstrap-table').on('uncheck.bs.table check.bs.table check-all.bs.table uncheck-all.bs.table',function(e,rows) {
	   var datas = $.isArray(rows) ? rows : [rows];        // 点击时获取选中的行或取消选中的行
	   console.log(datas[0])
	   examine(e.type, datas);                                 // 保存到全局 Set() 里
})

function examine(type,datas){
       if(type.indexOf('uncheck')===-1){
           $.each(datas,function(i,v){
               // 添加时,判断一行或多行的 id 是否已经在数组里 不存则添加 
               selectAllIds.indexOf(v.id) === -1 ? selectAllIds.push(v.id) : -1;
           });
       }else{
           $.each(datas,function(i,v){
               selectAllIds.splice(selectAllIds.indexOf(v.id),1);    //删除取消选中行
           });
       }
       console.log(selectAllIds);
}

截图:输出数组[0]元素, 输出数组选中的15行数据id值
在这里插入图片描述

2. 服务端分页类型:支持跨页全部选中,但注意特点

  • 解释(重要)
  • 服务端分页:即点击每页会提交一次查询请求去获取该页数据。(只获取加载一页)
  • 客户端分页:只向后台发一次请求,一次性获取并加载所有页的行数据。

对于表分页采取的是服务端分页类型,当前页数据可以全选中并获取,但是此时后面所有页数据并未查询也并未选中,是无法获取到的。当点击下一页时,responseHandle响应器会识别全选按钮的选中标志然后在加载时选中这一页的数据。

个人认为,这种时候想要在第一页就全选获取所有数据是不现实的,该方式不行。除非你挨个点一下翻页,依次追加到你的全局数组里(存储行id的容器)。

上代码:

// 假设两个按钮
<div class="toolbar">
  <button id="checkAll" class="btn btn-secondary">Check All</button>
  <button id="uncheckAll" class="btn btn-secondary">Uncheck All</button>
</div>

<script>
var  checkAll = false  // 这是是否选中的标志位
var selectAllIds = []  // 全局数组存放行id值

function queryList() {
	var options = {
		...
		responseHandler: responseHandler,
		columns: [
			{
                field: 'state',   // 复选框列名称,自定义即可
                checkbox: true   // 表明使用复选框
            },
            ...   // 其余是你的表字段列定义
		]
	}
	$.table.init(options);
}

$(function() {
	$('#checkAll').click(function () {
            checkAll = true  // 标志位置为true
            $('#bootstrap-table').bootstrapTable('checkAll')
    })
	$('#uncheckAll').click(function () {
      checkAll = false  // 取消全选,标志位置为false
      $('#table').bootstrapTable('uncheckAll')
    })
})

官方实现:服务端分页选中

3. 客户端分页类型,支持一次全部选中

由于客户端分页类型是第一次就加载了所有的数据,此时每页的数据都是存在的,那么在第一页全选就会将后面所有页数据都选中。

代码:

<div class="toolbar">
  <button id="checkAll" class="btn btn-secondary">Check All</button>
  <button id="uncheckAll" class="btn btn-secondary">Uncheck All</button>
</div>


<script>
  var $table = $('#table')
  
  function queryList() {
	var options = {
		...
		responseHandler: responseHandler,
		columns: [
			{
                field: 'state',   // 复选框列名称,自定义即可
                checkbox: true   // 表明使用复选框
            },
            ...   // 其余是你的表字段列定义
		]
	}
	$.table.init(options);
}

  $(function() {
    $('#checkAll').click(function () {
      $table.bootstrapTable('togglePagination').bootstrapTable('checkAll').bootstrapTable('togglePagination')
    })

    $('#uncheckAll').click(function () {
      $table.bootstrapTable('togglePagination').bootstrapTable('uncheckAll').bootstrapTable('togglePagination')
    })
  })
</script>

官方实现:客户端分页选中

4. 总结

  1. 方式一本质是监听了bootstrap-table的几个内置触发事件(选中、取消、全选中、全取消),当鼠标点击时,触发对应事件,做后续存储处理等;
  2. 方式二利用了表格的分页特点,服务端分页,点击全选中按钮时,将勾选的标志位置为true,然后依次将所有的行前勾选上。本质只能一次性勾选住当前行,当翻到下一页时,数据加载出来的同时responseHandler立马响应将本页行全部勾选上。所以本质上只能勾选上当前页,我们仔细观察可以看出来每到新的一页勾选会稍微落后一点点。
  3. 方式三利用了表格客户端分页的特点,是真正的一次就全部勾选并获取到全部勾选的数据。客户端分页的本质就是向后台发起一次请求,拿到全部的数据分页展示。那么全部勾选就可以把所有已加载的页行数据勾选上,也就能拿到所有数据。但是缺陷也有,只适合小数据量,大数据量一次加载会卡到怀疑人生,对服务器压力不可想象。

题外话,自己又突然想到了在服务端分页的情况下,其实可以这样曲线救国:
① 在每次输入筛选条件后,将筛选条件存起来;
② 数据加载出来并点击全选按钮后将筛选条件传参到后台服务端;
③ 在服务端根据筛选条件查询数据库,查到数据;
④ 执行后续操作,如删除。
这样就和服务端全选方式结合,算是实现全选删除的功能了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值