基于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 相关文章推荐
js原型链原理看图说明
Jul 07 Javascript
js获取页面传来参数的方法
Sep 06 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
javascript制作游戏开发碰撞检测的封装代码
Mar 31 Javascript
JavaScript数组去重的五种方法
Nov 05 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
微信小程序数据存储与取值详解
Jan 30 Javascript
Angular4 组件通讯方法大全(推荐)
Jul 12 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
Jul 13 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
简单说说angular.json文件的使用
Oct 29 Javascript
ES6 Array常用扩展的应用实例分析
Jun 26 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
再次研究下cache_lite
2007/02/14 PHP
深入密码加salt原理的分析
2013/06/06 PHP
php实例分享之二维数组排序
2014/05/15 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
2018/12/04 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
通过实例了解python property属性
2019/11/01 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
暑假实习求职信范文
2013/09/22 职场文书
优质的学校老师推荐信
2013/10/28 职场文书
装修五一活动策划案
2014/01/23 职场文书
计算机实训报告总结
2014/11/05 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
keepalived + nginx 实现高可用方案
2022/12/24 Servers