当前位置: 首页 > news >正文

Bootstrap Table 实现 分页选中

文章目录

    • 1. 支持分页选中,当前页选中、下一页选中等等数组叠加
    • 2. 服务端分页类型:支持跨页全部选中,但注意特点
    • 3. 客户端分页类型,支持一次全部选中
    • 4. 总结

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. 方式三利用了表格客户端分页的特点,是真正的一次就全部勾选并获取到全部勾选的数据。客户端分页的本质就是向后台发起一次请求,拿到全部的数据分页展示。那么全部勾选就可以把所有已加载的页行数据勾选上,也就能拿到所有数据。但是缺陷也有,只适合小数据量,大数据量一次加载会卡到怀疑人生,对服务器压力不可想象。

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

相关文章:

  • 嵌入式系统开发笔记89:认识AVR微控制器系统架构
  • GeoPandas安装
  • View-of-Delft数据集文件学习
  • 西门子PLC S7-1200如何实现远程上下载?
  • MySQL的SQL基础(五)
  • 图书巨头BakerTaylor遭勒索软件攻击 系统中断一周仍未恢复
  • 项目实战第三十六讲:基于 Sharding-JDBC 的商品分库⽅案
  • MySQL(进阶篇--InnoDB引擎)
  • 【Linux修炼】开篇
  • 【数学建模】层次分析(MatlabPython代码实现)
  • 如何用人工智能自动玩游戏
  • PIE-engine 教程 ——影像集合的使用for循环函数(北京市NDVI计算)
  • 数据结构-栈和队列(1)
  • 【微服务】springboot 整合 dubbo3.0
  • c++迭代器STL中的vector简单概述
  • 网络传输文件的问题
  • 2017届校招提前批面试回顾
  • Angular 2 DI - IoC DI - 1
  • js 实现textarea输入字数提示
  • Laravel Mix运行时关于es2015报错解决方案
  • MYSQL 的 IF 函数
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • underscore源码剖析之整体架构
  • 百度地图API标注+时间轴组件
  • 分布式事物理论与实践
  • 盘点那些不知名却常用的 Git 操作
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 自动记录MySQL慢查询快照脚本
  • ​​​​​​​​​​​​​​Γ函数
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # Java NIO(一)FileChannel
  • ###项目技术发展史
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (1) caustics\
  • (160)时序收敛--->(10)时序收敛十
  • (done) 两个矩阵 “相似” 是什么意思?
  • (待修改)PyG安装步骤
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (五)MySQL的备份及恢复
  • (一) storm的集群安装与配置
  • (转)jQuery 基础
  • (转)菜鸟学数据库(三)——存储过程
  • (转)树状数组
  • (自用)gtest单元测试
  • (自用)交互协议设计——protobuf序列化
  • ***测试-HTTP方法
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作