layui是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用。其外在极简,非常适合界面的快速开发。
官网地址:https://www.layui.com/doc/,使用方法可以直接参照即可。
今天小编也使用了下,并且遇到了一些问题,最为恼火的就是选中记忆功能,这框架既然没有,但是也不是不能解决,今天就来聊聊这个table分页checkbox没有记忆功能解决办法。
其实只需要一个2个标签即可,看代码
<form class="layui-fluid layui-form">
<table id="sale-data" lay-filter="sale-data"></table>
</form>
由于我还是用到了vue框架,为了更好的使用layui我还创建了一个layui-config.js文件
var element,$,layer,laydate,laypage,table,form;
layui.use(['element','jquery','layer','laydate','laypage','table'], function () {
element = layui.element;
$ = layui.$;
layer = layui.layer;
laydate = layui.laydate;
laypage = layui.laypage;
table = layui.table;
form = layui.form;
//阻止from表单默认行为
form.on('submit(*)', function (data) {
return false;
});
//初始化动态元素,一些动态生成的元素如果不设置初始化,将不会有默认的动态效果
element.init();
});
另外创建了一个业务处理的js文件,handle.js文件,以下主要贴上table处理的代码
//记录当前页数据的临时变量
var cookiePageArray = [];
var saleInfoCols = [[ //表头
{
type: 'checkbox', fixed: 'left',LAY_CHECKED : false, filter : 'checkboxid'
},
{
field: 'realName',
title: '病人姓名',
sort: true
},
{
field: 'combinationItemName',
title: '项目名称',
},
{
field: 'noteTime',
title: '实际录入时间',
},
{
field: 'price',
title: '项目价格',
},
{
field: 'discount',
title: '折扣',
sort: true//允许排序
,edit: 'text'//允许编辑
},
{
field: 'reportTime',
title: '出报告时间',
sort: true//允许排序
,edit: 'text'//允许编辑
},
{
field: 'invoiceTime',
title: '开票日期',
sort: true//允许排序
,edit: 'text'//允许编辑
},
{
field: 'realPrice',
title: '实收金额',
sort: true//允许排序
,edit: 'text'//允许编辑
}
,{fixed: 'right', title:'操作', toolbar: '#sale-data-bar', width:80}
]];
//存储已选择数据集,用普通变量存储也行,就是一个缓存变量
layui.data('checked', null);
//第一个实例
var mytbl = table.render({
elem: '#sale-data',
id : 'jzbbxh',//checkbox取值使用的
title : "列表",
skin: 'row', //行边框风格
method : 'get',
even: true, //开启隔行背景
height: 'full-185',//满屏
url: '/lis/searchSaleinfoData', //数据接口 controller
page: true, //开启分页
limit : 13,//每页多少行
limits : [13,30,90],//分页条目
loading : true,//显示加载条
where : {},//这里是传参,我这里没有参数
text: {
none: '暂无相关数据' //默认:无数据。注:该属性为 layui 2.2.5 开始新增
},
cols: saleInfoCols,//绑定的列表头部
done:function(res,curr,count){
//.假设你的表格指定的 id="sale-data",找到框架渲染的表格
var tbl = $('#sale-data').next('.layui-table-view');
//记下当前页数据,Ajax 请求的数据集,对应你后端返回的数据字段
cookiePageArray = res.data;
//记录当前也选中的chechbox个数(判断全选使用的)
var len = 0;
//遍历当前页数据,对比已选中项中的 id
for (var index = 0; index < cookiePageArray.length; index++) {
if (layui.data('checked', cookiePageArray[index]['jzbbxh'])) {
//逐个判断是否选中,如果已经选中就改变选中模式
var i = cookiePageArray[index]['LAY_TABLE_INDEX'];
var checkbox = $('.layui-table tr[data-index=' + i + '] input[type="checkbox"]');
checkbox.prop('checked', true);
checkbox.next().addClass('layui-form-checked');
//为了设置全选的
len++;
}
}
console.log(this.limit+"====="+len)
//设置全选checkbox的选中状态,只有改变LAY_CHECKED的值, table.checkStatus才能抓取到选中的状态
if(len === this.limit){
var checkboxAll = $('.layui-table-header th[data-field=0] input[type="checkbox"]');
checkboxAll.prop('checked', true);
checkboxAll.next().addClass('layui-form-checked');
}
//暂时只能这样渲染表单
form.render('checkbox');
}
});
/**
* 复选框的点击事件
* 主要操作为:
* 将所有的勾选成功的id储存传入后台拉取数据存到本地销售数据库
*/
table.on('checkbox(sale-data)', function(obj){
//console.log(obj.type); //如果触发的是全选,则为:all,如果触发的是单选,则为:one
//全选或单选数据集不一样
var data = 'one' === obj.type ? [obj.data] : cookiePageArray;
//遍历数据
$.each(data, function(index, item) {
//假设你数据中 id 是唯一关键字
if (obj.checked) {
//.增加已选中项
layui.data('checked', {
key: item.jzbbxh, value: item
});
} else {
//.删除
layui.data('checked', {
key: item.jzbbxh, remove: true
});
}
});
console.log(layui.data('checked'));
});
由于layui没有自己的记忆功能,所以需要自己来实现,我们先来看看layui给我们checkbox生成的代码吧
未勾选生成的代码:
<div class="layui-table-cell laytable-cell-2-0-0 laytable-cell-checkbox">
<input type="checkbox" name="layTableCheckbox" lay-skin="primary">
<div class="layui-unselect layui-form-checkbox" lay-skin="primary">
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
已勾选生成的代码:
<div class="layui-table-cell laytable-cell-2-0-0 laytable-cell-checkbox">
<input type="checkbox" name="layTableCheckbox" lay-skin="primary">
<div class="layui-unselect layui-form-checkbox layui-form-checked" lay-skin="primary">
<i class="layui-icon layui-icon-ok"></i>
</div>
</div>
以上2段代码大家可以看出来问题了。大家不要认为将div的class上添加一个layui-form-checked就可以了,这样是不行的。
我们来看看如何解决checkbox选中记忆的。需要将input的类型为checkbox的checkbox.prop('checked', true);并且还需要将下一个兄弟节点的div添加一个类名为:layui-form-checked的,这样才能选中。那么说道这里问题就解决了,其实并不是。
由于我的limit是每页显示13行,也就是说按道理每页不算上全选按钮应该只有13个checkbox,后来我使用以下代码打印出来是26个checkbox。
var checkboxs = $('.layui-table-view tbody input[type="checkbox"]');
checkboxs .each(function(index, item){
console.log(item);
});
那么这个时候问题就出来了,每个checkbox都是一对一对的一模一样的,最主要行的索引data-index是一样的,只是在不同table中,这个时候我们只需要根据临时勾选的数据保存到缓存中。
然后翻页的时候再根据循环缓存数据与当前页的数据一个个匹配,匹配成功之后,将将当前的页的索引拿到,然后拼接成$('.layui-table tr[data-index=' + i + '] input[type="checkbox"]');
这样就可以找到成对的checkbox了,然后改变值,最后再将它的兄弟节点的div增加一个layui-form-checked,这样就可以成对的改变值了。这样就有了记忆功能了,不过还是有一点点小麻烦。
layui这个前端框架,对于前端不太熟悉的开发人员使用起来还是比较方便快速的。它的主要好处就是可以快速的搭建一个后台系统出来,不过不好的就是,很多模板要花钱,在一个就是他的一些插件并不是完美,需要自己动手再次封装。不过开放出来的免费的东西就这样了,将就使用还是不错的。