基于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 相关文章推荐
jQuery使用动态渲染表单功能完成ajax文件下载
Jan 15 Javascript
JS应用正则表达式转换大小写示例
Sep 18 Javascript
Jquery结合HTML5实现文件上传
Jun 25 Javascript
javascript实现拖动元素交换位置
Nov 29 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
May 18 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
Sep 13 Javascript
微信小程序实现页面跳转传值的方法
Oct 12 Javascript
EasyUI实现下拉框多选功能
Nov 07 Javascript
iview中Select 选择器多选校验方法
Mar 15 Javascript
koa socket即时通讯的示例代码
Sep 07 Javascript
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
js get和post请求实现代码解析
Feb 06 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虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
安装Python的教程-Windows
2017/07/22 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python3获取url文件大小示例代码
2019/09/18 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
如何用python处理excel表格
2020/06/09 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
日本无添加化妆品:HABA
2016/08/18 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
财务会计毕业生个人求职信
2014/02/03 职场文书
保护环境的建议书
2014/03/12 职场文书
公司承诺书怎么写
2014/05/24 职场文书
门面房租房协议书
2014/08/20 职场文书
计算机专业自荐信
2015/03/05 职场文书
高中生军训感言
2015/08/01 职场文书
《将心比心》教学反思
2016/02/23 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书