基于layui的table插件进行复选框联动功能的实现方法


Posted in Javascript onSeptember 19, 2019

实际项目功能:

给员工账号进行分配权限(增加权限,修改权限)

实现思路:

用表格展示权限列表?>勾选分配该账号的权限?>调用接口

出现的问题:

因为某些权限之间是有关联的,比如: “ 查看材料 ” 和 “ 修改材料 ” ,这两个权限是有联系的,当你勾选 “ 修改材料 ” 权限的时候,那么, “ 查看材料 ” 权限也要勾选上,当你取消勾选 “ 查看材料 ”权限的时候,“ 修改材料 ” 权限也要取消。

所以当用户勾选某个权限的时候,我们要通过js代码去判断是否有和这个权限相关的权限,如果有,就需要通过js代码自动勾选或取消勾选。

而layui的table插件没有提供通过js代码自动勾选或取消勾选复选框的方法;

解决方案:

通过table的reload方法和form的render方法实现

思路:

//以查看材料和修改材料权限为例:查看材料的id为2,修改材料的id为3
//用户点击复选框时,触发的回调函数
table.on('checkbox(quanXianAll)', function(obj) {
 //判断是否是全选
 if (obj.type === "one") {
   //判断判断选中的权限是否为“修改材料”
   if (obj.data.id === 3) {
    //判断是否选中状态
    if (obj.checked) {
     tableIns.reload({
      data:data,
      done: function (res) {
       //根据“查看材料”权限的id获取的索引
       var n = res.data.findIndex(function (item, i) {
        if (item.id === 2) {
         return true
        }
       })
       //判断查看材料”权限是否已被勾选
       if(!res.data[n].LAY_CHECKED){
        res.data[n].LAY_CHECKED = true;
        $(".layui-table-body").find("tr[data-index=" + n + "]").find('input[name="layTableCheckbox"]').prop("checked", true);
        form.render('checkbox');
       }

      }
     })
    }
   }
  }
})

这种关联肯定不止一个,所以我们要把代码进行封装。(思路应该说明白了,代码就不再进行这里封装了)

在table的源文件中添加一个这样的方法

在table源码中的a.elem.on("click", 'input[name="layTableCheckbox"]+', function () {}方法内,添加以下方法

var mylaysetCheck= function (index,checked,callbacks) {
 var e=t("table[lay-filter="+f+"]").next().find(".layui-table-box").find(".layui-table-main").find("tr[data-index="+index+"]"),
  l = e.parents("tr").eq(0).data("index"), n = e[0].checked,
  o = "layTableAllChoose" === e.attr("lay-filter");

 e.find('input[name="layTableCheckbox"]').prop("checked",checked);
 if(callbacks){
  this.setCheckData(index, checked), this.syncCheckAll();a.renderForm("checkbox");
  layui.event.call(this, s, "checkbox(" + f + ")", {
   checked: n,
   data: d.cache[a.key] ? d.cache[a.key][l] || {} : {},
   type: o ? "all" : "one",
   mysetCheck:mylaysetCheck.bind(a)
  })
 }else {
  this.setCheckData(index, checked), this.syncCheckAll();a.renderForm("checkbox");

 }
};

在table源码中

a.elem.on("click", 'input[name="layTableCheckbox"]+', function () {}方法内有一个layui.event.call()函数===> 源码为:

layui.event.call(this, s, "checkbox(" + f + ")", {
 checked: n,
 data: d.cache[a.key] ? d.cache[a.key][l] || {} : {},
 type: o ? "all" : "one"
})

改为:

layui.event.call(this, s, "checkbox(" + f + ")", {
 checked: n,
 data: d.cache[a.key] ? d.cache[a.key][l] || {} : {},
 type: o ? "all" : "one",
 mysetCheck:mylaysetCheck.bind(a)
})

通过以下代码调用

//用户点击复选框时,触发的回调函数
table.on('checkbox(test)', function(obj){
 //两个参数,第一个是数组的索引,第二个是是否勾选,第三个是否使用回调函数
 obj.mysetCheck(index,checked,callbacks);
});

//案例:查看材料的id为2,索引为2;修改材料的id为3,索引为3
table.on('checkbox(quanXianAll)', function(obj){
 if(obj.data.id===3&&obj.checked){
  obj.mysetCheck(2,true,true);
 }
 if(obj.data.id===2&&!obj.checked){
  obj.mysetCheck(3,false,true);
 }

});
//这样就可以实现:勾选“修改材料”时也会把“查看材料”勾选上,取消勾选“查看材料”时也会取消“修改材料”的勾选

对比:

第一种方法不用修改源码,但代码量多,且不是局部刷新;

第二种方法是局部刷新,代码不多,但是修改源码,设计到版本迁移的问题,且业务逻辑错误,容易发生无限循环;

以上这篇基于layui的table插件进行复选框联动功能的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
Apr 20 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
Aug 14 Javascript
js实例属性和原型属性示例详解
Nov 23 Javascript
jquery+php实现搜索框自动提示
Nov 28 Javascript
jQuery中remove()方法用法实例
Dec 25 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
May 11 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
Aug 20 Javascript
JS截取与分割字符串常用技巧总结
Nov 10 Javascript
Javascript简写条件语句(推荐)
Jun 12 Javascript
JS实现类似51job上的地区选择效果示例
Nov 17 Javascript
微信小程序实现搜索框功能及踩过的坑
Jun 19 Javascript
解决layui的table插件无法多层级获取json数据的问题
Sep 19 #Javascript
Layui数据表格 前后端json数据接收的方法
Sep 19 #Javascript
用原生JS实现爱奇艺首页导航栏代码实例
Sep 19 #Javascript
vue简单练习 桌面时钟的实现代码实例
Sep 19 #Javascript
JS实现滚动条触底加载更多
Sep 19 #Javascript
Vue v-text指令简单使用方法示例
Sep 19 #Javascript
Vue.set 全局操作简单示例
Sep 19 #Javascript
You might like
自定义php类(查找/修改)xml文档
2013/03/26 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
php实现Session存储到Redis
2015/11/11 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
MySQL最常见的操作语句小结
2015/05/07 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
python方向键控制上下左右代码
2018/01/20 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
德购商城:德国进口直邮商城
2017/06/13 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python