基于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中常用的运算符小结
Jan 18 Javascript
JavaScript包装对象使用介绍
Aug 29 Javascript
javascript 实现子父窗体互相传值的简单实例
Feb 17 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
May 27 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
Jan 09 Javascript
第四章之BootStrap表单与图片
Apr 25 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
Dec 28 Javascript
JS实现css hover操作的方法示例
Apr 07 Javascript
vue 2.0封装model组件的方法
Aug 03 Javascript
JS实现获取word文档内容并输出显示到html页面示例
Jun 23 Javascript
基于游标的分页接口实现代码示例
Nov 12 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
Jan 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
php自动加载的两种实现方法
2010/06/21 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
Django 前后台的数据传递的方法
2017/08/08 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
python hook监听事件详解
2018/10/25 Python
Django 内置权限扩展案例详解
2019/03/04 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
Python 求数组局部最大值的实例
2019/11/26 Python
python deque模块简单使用代码实例
2020/03/12 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
HTML5 Canvas 起步(2) - 路径
2009/05/12 HTML / CSS
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
蜜蜂引路教学反思
2014/02/04 职场文书
音乐学专业求职信
2014/07/22 职场文书
大学计划书范文800字
2014/08/14 职场文书
入党介绍人意见范文
2015/06/01 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
Python如何使用循环结构和分支结构
2022/04/13 Python