注:该方式无法做到点击第一页选中全部页数据。支持当前页全选/选几行,下一页再点击全选/选几行,数组内容会叠加。
代码:
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值
对于表分页采取的是服务端分页类型,当前页数据可以全选中并获取,但是此时后面所有页数据并未查询也并未选中,是无法获取到的。当点击下一页时,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')
})
})
官方实现:服务端分页选中
由于客户端分页类型是第一次就加载了所有的数据,此时每页的数据都是存在的,那么在第一页全选就会将后面所有页数据都选中。
代码:
<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>
官方实现:客户端分页选中
题外话,自己又突然想到了在服务端分页的情况下,其实可以这样曲线救国:
① 在每次输入筛选条件后,将筛选条件存起来;
② 数据加载出来并点击全选按钮后将筛选条件传参到后台服务端;
③ 在服务端根据筛选条件查询数据库,查到数据;
④ 执行后续操作,如删除。
这样就和服务端全选方式结合,算是实现全选删除的功能了。