layui 第三方組件平臺(tái)

返回首頁(yè) 發(fā)布組件

layui 表格edit編輯及表格數(shù)據(jù)校驗(yàn)功能

更新:2020-6-15 創(chuàng)建:2019-11-11

文檔

討論問(wèn)題帖子: https://fly.layui.com/jie/66450/
一、概述

edit新增的功能是基于lay-event事件進(jìn)行的aop增強(qiáng)實(shí)現(xiàn)的,因此在cols配置的屬性中務(wù)必開(kāi)啟lay-event點(diǎn)擊事件!由于在table.on('tool(yyy)',function (obj) {})方法基礎(chǔ)上進(jìn)行的aop代理而產(chǎn)生的AopEvent代理對(duì)象,因此此代理對(duì)象的on方法與table的on('tool(yyy)')方法使用方式是一致的,即table的on('tool(yyy)')方法里的回調(diào)函數(shù)可以作為代理對(duì)象的on方法的回調(diào)函數(shù)。因此使用者可以按照之前的代碼格式編寫代碼,而不用擔(dān)心代理對(duì)象內(nèi)部發(fā)生了何種復(fù)雜的代碼實(shí)現(xiàn),以及l(fā)ayui table源碼發(fā)生變化也不會(huì)導(dǎo)致組件的不可用或者需要對(duì)組件進(jìn)行相應(yīng)的修改(零入侵table源碼)。----拿來(lái)即用


新增的功能
1、下拉框(單或多選)
2、日期選擇框
3、下拉框聯(lián)動(dòng)(下拉框聯(lián)動(dòng)下拉框、日期框聯(lián)動(dòng)下拉框)
4、輸入框(該輸入框與官網(wǎng)的不一致,失去焦點(diǎn)事件會(huì)對(duì)table.on('tool(lay-filter)',function(obj){})進(jìn)行回調(diào))
5、數(shù)據(jù)校驗(yàn)

lay-event開(kāi)啟例子
table.render({cols:[[{field:'name',title: '姓名',width:120,event:'name'}]]}); //開(kāi)啟event功能
二、問(wèn)題

用官方模板實(shí)現(xiàn)的表格下拉框存在以下問(wèn)題:
1、下拉框數(shù)據(jù)過(guò)多時(shí),表格產(chǎn)生很長(zhǎng)的滾動(dòng)條
2、無(wú)關(guān)鍵詞模糊搜索出相應(yīng)的下拉數(shù)據(jù)
3、數(shù)據(jù)過(guò)多時(shí),下拉框被表頭所遮住,修改表格的樣式會(huì)出現(xiàn)其他的bug
4、無(wú)法實(shí)現(xiàn)復(fù)雜操作(下拉框單多選和級(jí)聯(lián)可配置等)
5、有部分表格下拉框組件還是比較優(yōu)秀的,但是也還是無(wú)法解決以上所有的問(wèn)題,或者解決了80%,但入侵layui table的源碼過(guò)重,不利于使用與維護(hù)
6、無(wú)法與layui table的事件進(jìn)行整合

用data-edit(cols中edit屬性)實(shí)現(xiàn)的日期選擇框存在以下問(wèn)題:
1、只有輸入框值改變時(shí)才觸發(fā)的table.on('edit(lay-filter)',function(obj){})方法的回調(diào),因此用戶體驗(yàn)較差

三、解決方案

思路:?jiǎn)卧顸c(diǎn)擊事件(可以是自定義事件) => 生成自定義的輸入框(input) => 在當(dāng)前窗口body元素生成最后一個(gè)div子元素(下拉框) => 給input注冊(cè)值改變事件用于關(guān)鍵詞搜索
=> 給div注冊(cè)點(diǎn)擊事件用于數(shù)據(jù)選擇及相對(duì)應(yīng)的事件回調(diào)

方案一
table表格渲染完成后,在done方法中自定義單元格事件。此方案能完成80%的功能,但因無(wú)法與layui table的事件進(jìn)行整合,使用起來(lái)較為復(fù)雜。

方案二
在table.on('tool(yyy)',function (obj) {})方法回調(diào)的事件中,根據(jù)當(dāng)前單元格(this)進(jìn)行動(dòng)態(tài)生成下拉框或者日期選擇框。此方案已解決了所有的問(wèn)題,但對(duì)使用者對(duì)layui table組件的熟練度有一定要求(從部分后端猿咨詢中可知)。

方案三
在方案二的基礎(chǔ)上對(duì)table.on('tool(yyy)',function (obj) {})中的方法進(jìn)行aop代理增強(qiáng),實(shí)現(xiàn)0入侵layui table源碼無(wú)縫整合。此方案為最終的方案。

三、文檔




四、最簡(jiǎn)潔的栗子

引入組件
    layui.config({
base: 'module/'
}).extend({
tableEdit:'js/tableEdit'
}).use(['table','tableEdit'], function () {
var table = layui.table,tableEdit = layui.tableEdit;
});
完整栗子
<table class="layui-hide" id="tableId" lay-filter="tableEvent"></table>
<script>
layui.config({
base: 'module/'
}).extend({
tableEdit:'js/tableEdit'
}).use(['table','tableEdit','layer'], function () {
var table = layui.table,tableEdit = layui.tableEdit,$ = layui.$;
var params = [{name:1,value:"張三1"},{name:2,value:"張三2"},{name:3,value:"張三3"},{name:4,value:"張三4"},{name:5,value:"張三5"}];
var cols = table.render({
elem: '#tableId'
,id:'id'
,url:'module/json/data.json'
,height: 'full-90'
,page: true
,cols: [[
{type:'checkbox'}
//type的類型值:select(下拉框)date(時(shí)間選擇框)input(輸入框)
//input為輸入框,失去焦點(diǎn)會(huì)觸發(fā)回調(diào),aopTable.on()中觸發(fā)的回調(diào)
,{field:'name',title: '輸入框',width:120,event:'name',config:{type:'input'}}
//data 為下拉框數(shù)據(jù)
,{field:'danxuan',align:'center', title: '單選',width:120,event:'danxuan',config:{type:'select',data:params},templet:function (d) {
return d.danxuan && d.danxuan.value ? d.danxuan.value : '';
}}
// enabled => true:多選,false:?jiǎn)芜x。默認(rèn)為false
,{field:'duoxuan', title: '多選',width:120,event:'duoxuan',config:{type:'select',data:params,enabled:true},templet:function (d) {
var str = [];
d.duoxuan.forEach(function (e) {
str.push(e.value)
});
return str.join(' || ');
}}
//dateType表示日期時(shí)間格式,date為“yyyy-MM-dd”,datetime為“yyyy-MM-dd HH:ss:mm”
,{field:'birthday', title: '生日',width:120,event:'birthday',config:{type:'date',dateType:'date'}}
//cascadeSelectField字段為級(jí)聯(lián)開(kāi)關(guān)字段(存在該字段則級(jí)聯(lián),否則不級(jí)聯(lián))
,{field:'xlkjl', title: '下拉框聯(lián)動(dòng)(上級(jí))',width:150,event:'xlkjl',config:{type:'select',data:params,cascadeSelectField:'xialaxiaji'},templet:function (d) {
return d.xlkjl && d.xlkjl.value ? d.xlkjl.value : '';
}}
,{field:'xialaxiaji', title: '下拉框聯(lián)動(dòng)(下級(jí))',width:150,event:'xiaji',config:{type:'select',data:params},templet:function (d) {
return d.xialaxiaji && d.xialaxiaji.value ? d.xialaxiaji.value : '';
}}
,{field:'rqjl', title: '日期聯(lián)動(dòng)(上級(jí))',width:150,event:'rqjl',config:{type:'date',dateType:'date',cascadeSelectField:'rqxiaji'}}
,{field:'rqxiaji', title: '日期框聯(lián)動(dòng)(下級(jí))',width:150,event:'rqxiaji',config:{type:'select',data:params},templet:function (d) {
return d.rqxiaji && d.rqxiaji.value ? d.rqxiaji.value : '';
}}
]]
}).config.cols;

/**
* 參數(shù)cols是table.render({})中的cols屬性值
* aop代理是基于event點(diǎn)擊事件進(jìn)行操作的,因此cols中務(wù)必開(kāi)啟event點(diǎn)擊事件!
**/
var aopTable = tableEdit.aopObj(cols); //獲取一個(gè)aop對(duì)象
/**
* 注意:
* 1、 aopTable.on('tool(xxx)',function (obj) {})
* 2、 table.on('tool(yyy)',function (obj) {})
* 如果1中的xxx與2中的yyy字符串相同時(shí),不能同時(shí)用,用了會(huì)造成后調(diào)用者覆蓋前調(diào)用者。
* 應(yīng)該直接用1來(lái)代替2,因?yàn)?中包含了2中的事件。
* 如果不相同,則可以同時(shí)使用。
**/
aopTable.on('tool(tableEvent)',function (obj) {
var field = obj.field; //單元格字段
var value = obj.value; //修改后的值
var data = obj.data; //當(dāng)前行舊數(shù)據(jù)
var event = obj.event; //當(dāng)前單元格事件屬性值
var update = {};
update[field] = value;
//把value更新到行中
obj.update(update);
/**
*說(shuō)白了,此obj與table.on('tool(tableEvent)',function (obj) {})
*中的obj對(duì)象是同一個(gè),所以可以如此操作。
*
* */
});


/**
* 級(jí)聯(lián)下拉框 => 點(diǎn)擊事件生成下拉框之前的回調(diào)函數(shù)
* 主要用于 => 動(dòng)態(tài)獲取單元格下拉數(shù)據(jù)
* tableEvent => table的lay-filter屬性值
* 如示例代碼所示
*/
tableEdit.on('clickBefore(tableEvent)',function (obj) {
var cascadeSelectData = obj.data; //級(jí)聯(lián)數(shù)據(jù)
var cascadeSelectField = obj.field; //級(jí)聯(lián)字段
if(Array.isArray(cascadeSelectData)){
cascadeSelectData = cascadeSelectData[0];
}
var reslut = null;
//下拉數(shù)據(jù) 只可ajax同步請(qǐng)求后臺(tái)
if(cascadeSelectField === 'rqjl'){ //日期級(jí)聯(lián)下拉框
if(cascadeSelectData === '2020-05-11'){
reslut = {
data:[{name:1,value:'語(yǔ)文'},{name:2,value:'數(shù)學(xué)'},{name:3,value:'英語(yǔ)'},{name:4,value:'物理'},{name:5,value:'化學(xué)'}],
enabled:false //單選 true為多選
};
}else {
reslut = {
data:[{name:6,value:'政治'},{name:7,value:'地理'},{name:8,value:'歷史'},{name:9,value:'生物'},{name:10,value:'音樂(lè)'}],
enabled:false //單選 true為多選
};
}
}else {
if(cascadeSelectData.name+'' === '1'){
reslut = {
data:[{name:11,value:'貴州'},{name:12,value:'云南'},{name:13,value:'四川'},{name:14,value:'湖南'}],
enabled:false //單選 true為多選
};
}else {
reslut = {
data:[{name:15,value:'荊州'},{name:16,value:'揚(yáng)州'},{name:17,value:'杭州'},{name:18,value:'蘇州'}],
enabled:false //單選 true為多選
};
}
}
return reslut;
});
});
</script>
效果圖

單選下拉框


多選下拉框


日期選擇框


下拉框級(jí)聯(lián)下拉框


日期選擇框級(jí)聯(lián)下拉框


下載

立即下載 去碼云下載
該擴(kuò)展組件由第三方用戶主動(dòng)投遞,并由其自身進(jìn)行維護(hù),本站僅做收集。