基于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 相关文章推荐
JavaScript 入门·JavaScript 具有全范围的运算符
Oct 01 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
Jul 08 Javascript
js中数组Array的一些常用方法总结
Aug 12 Javascript
JavaScript中判断整字类型最简洁的实现方法
Nov 08 Javascript
node.js微信公众平台开发教程
Mar 04 Javascript
canvas绘制万花筒效果(代码分享)
Jan 20 Javascript
jquery将标签元素的高设为屏幕的百分比
Apr 19 jQuery
浅谈FastClick 填坑及源码解析
Mar 02 Javascript
用p5.js制作烟花特效的示例代码
Mar 21 Javascript
解决angularJS中input标签的ng-change事件无效问题
Sep 13 Javascript
Vue实现星级评价效果实例详解
Dec 30 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
Nov 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
建立动态的WML站点(二)
2006/10/09 PHP
php.ini 中文版
2006/10/28 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
js 图片轮播(5张图片)
2008/12/30 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
Python的另外几种语言实现
2015/01/29 Python
Python中非常实用的一些功能和函数分享
2015/02/14 Python
浅谈python中截取字符函数strip,lstrip,rstrip
2015/07/17 Python
python搭建微信公众平台
2016/02/09 Python
Python3 伪装浏览器的方法示例
2017/11/23 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
python opencv读mp4视频的实例
2018/12/07 Python
python实现QQ批量登录功能
2019/06/19 Python
店长助理岗位职责
2013/12/13 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
保留意见审计报告
2015/06/05 职场文书
何玥事迹观后感
2015/06/16 职场文书
学习委员竞选稿
2015/11/20 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
在redisCluster中模糊获取key方式
2021/07/09 Redis