基于layui的table插件進(jìn)行復(fù)選框聯(lián)動功能的實(shí)現(xiàn)方法
實(shí)際項(xiàng)目功能:
給員工賬號進(jìn)行分配權(quán)限(增加權(quán)限,修改權(quán)限)
實(shí)現(xiàn)思路:
用表格展示權(quán)限列表–>勾選分配該賬號的權(quán)限–>調(diào)用接口
出現(xiàn)的問題:
因?yàn)槟承?quán)限之間是有關(guān)聯(lián)的,比如: “ 查看材料 ” 和 “ 修改材料 ” ,這兩個權(quán)限是有聯(lián)系的,當(dāng)你勾選 “ 修改材料 ” 權(quán)限的時候,那么, “ 查看材料 ” 權(quán)限也要勾選上,當(dāng)你取消勾選 “ 查看材料 ”權(quán)限的時候,“ 修改材料 ” 權(quán)限也要取消。
所以當(dāng)用戶勾選某個權(quán)限的時候,我們要通過js代碼去判斷是否有和這個權(quán)限相關(guān)的權(quán)限,如果有,就需要通過js代碼自動勾選或取消勾選。
而layui的table插件沒有提供通過js代碼自動勾選或取消勾選復(fù)選框的方法;
解決方案:
通過table的reload方法和form的render方法實(shí)現(xiàn)
思路:
//以查看材料和修改材料權(quán)限為例:查看材料的id為2,修改材料的id為3
//用戶點(diǎn)擊復(fù)選框時,觸發(fā)的回調(diào)函數(shù)
table.on('checkbox(quanXianAll)', function(obj) {
//判斷是否是全選
if (obj.type === "one") {
//判斷判斷選中的權(quán)限是否為“修改材料”
if (obj.data.id === 3) {
//判斷是否選中狀態(tài)
if (obj.checked) {
tableIns.reload({
data:data,
done: function (res) {
//根據(jù)“查看材料”權(quán)限的id獲取的索引
var n = res.data.findIndex(function (item, i) {
if (item.id === 2) {
return true
}
})
//判斷查看材料”權(quán)限是否已被勾選
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');
}
}
})
}
}
}
})
這種關(guān)聯(lián)肯定不止一個,所以我們要把代碼進(jìn)行封裝。(思路應(yīng)該說明白了,代碼就不再進(jìn)行這里封裝了)
在table的源文件中添加一個這樣的方法
在table源碼中的a.elem.on("click", 'input[name="layTableCheckbox"]+', function () {}方法內(nèi),添加以下方法
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 () {}方法內(nèi)有一個layui.event.call()函數(shù)===> 源碼為:
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)
})
通過以下代碼調(diào)用
//用戶點(diǎn)擊復(fù)選框時,觸發(fā)的回調(diào)函數(shù)
table.on('checkbox(test)', function(obj){
//兩個參數(shù),第一個是數(shù)組的索引,第二個是是否勾選,第三個是否使用回調(diào)函數(shù)
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);
}
});
//這樣就可以實(shí)現(xiàn):勾選“修改材料”時也會把“查看材料”勾選上,取消勾選“查看材料”時也會取消“修改材料”的勾選
對比:
第一種方法不用修改源碼,但代碼量多,且不是局部刷新;
第二種方法是局部刷新,代碼不多,但是修改源碼,設(shè)計到版本遷移的問題,且業(yè)務(wù)邏輯錯誤,容易發(fā)生無限循環(huán);
以上這篇基于layui的table插件進(jìn)行復(fù)選框聯(lián)動功能的實(shí)現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
js實(shí)現(xiàn)文本框輸入文字個數(shù)限制代碼
這篇文章主要介紹了js實(shí)現(xiàn)文本框輸入文字個數(shù)限制代碼,文本框輸入的文字個數(shù)并不是無限制的,一般都會限定一個輸入最高上限,如何限制,請看本文2015-12-12
JavaScript中push(),join() 函數(shù) 實(shí)例詳解
本文通過實(shí)例給大家介紹了JavaScript中push(),join() 的知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09
完美解決spring websocket自動斷開連接再創(chuàng)建引發(fā)的問題
下面小編就為大家?guī)硪黄昝澜鉀Qspring websocket自動斷開連接再創(chuàng)建引發(fā)的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
js判斷請求的url是否可訪問,支持跨域判斷的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨s判斷請求的url是否可訪問,支持跨域判斷的實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
微信小程序+mqtt,esp8266溫濕度讀取的實(shí)現(xiàn)方法
這篇文章主要介紹了微信小程序+mqtt,esp8266溫濕度讀取的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
javascript iframe中打開文件,并檢測iframe存在否
從iframe中打開文件,并檢測iframe存在否如果說只是檢測頁面存在否,直接設(shè)置target用偽協(xié)議就可以解決了...2008-12-12

