LayUI + js实现全选、多选、翻页勾选(LayUI数据表格 方法渲染 模式)

1 var pageDataIdMap;
2 var idMap = new Map();

先定义一个用来存放 每一页 的 所有数据行 ID 的map集合  --> pageDataIdMap

再创建一个用来存放 我们勾选的数据行 ID 的map集合  -->  idMap

 

 1 layui.use(['layer', 'jquery', 'table'], function() {
 2     table.render({
 3         page: { 
 4         },
 5         done: function (res, curr, count) {
 6             pageDataIdMap = new Map();
 7             for(var i = 0;i < len;i++){   //填充当前页的数据
 8                 pageDataIdMap[res.data[i].id] = res.data[i].id;
 9             }
10         },
11         cols: colArr
12     });
13 });

渲染每一页的数据行时,在 done将这一页的所有数据行 ID 保存到 pageDataIdMap 中。

 

1 <div style="padding: 10px;">
2     <table class="layui-hide layui-table" id="jzqyListTable" lay-size="sm" lay-filter="demo">
3     </table>
4 </div>
 1 table.on('checkbox(demo)', function(obj){
 2     if(obj.type == 'one'){    //单选操作
 3         if(obj.checked){     //选中
 4             idMap[obj.data.id] = obj.data.id;
 5         }else{      //取消选中
 6             for(var key in idMap){
 7                 if(key == obj.data.id){   //移除取消选中的id
 8                     delete idMap[obj.data.id];
 9                 }
10             }
11          }
12     }else{      //全选操作
13          if(obj.checked){    //选中
14              for(var pageKey in pageDataIdMap){
15                  idMap[pageKey] = pageKey;
16              }
17          }else{     //取消选中
18              for(var pageKey in pageDataIdMap){
19                  for(var key in idMap){
20                      if(key == pageKey){
21                          delete idMap[pageKey];
22                      }
23                  }
24              }
25          }
26     }
27 });                

这里使用LayUI的监听事件,来监听方法渲染的表格 数据 的勾选 --> table.on('checkbox(demo)', function(obj){}

单选  -->  obj.type = 'one'       全选  -->  obj.type = 'all'

选中  -->  obj.checked = true    未选中  -->  obj.checked = false

如果是单选时候的选中,就讲这个勾选的数据行 ID 存放到 idMap 中;如果是全选的选中,就遍历 pageDataIdMap,将其中的 ID 存放到 idMap 中。

如果是单选时候的取消选中,就遍历 idMap 将取消勾选的数据行 ID 从 idMap 中移除;如果是全选的取消选中,就遍历 idMap 和 pageDataIdMap,将 pageDataIdMap 中有的 ID 全部从 idMap 中移除。

 

 1 layui.use(['layer', 'jquery', 'table'], function() {
 2     table.render({
 3         page: { 
 4         },
 5         done: function (res, curr, count) {
 6             var len = res.data.length;
 7             var chooseNum = 0;   //记录当前页选中的数据行数
 8             for(var i = 0;i < len;i++){   //勾选行回显
 9                 for(var key in idMap){
10                     if(res.data[i].id == key){
11                         res.data[i]["LAY_CHECKED"]='true';
12                         //找到对应数据改变勾选样式,呈现出选中效果
13                         var index= res.data[i]['LAY_TABLE_INDEX'];
14                         $('tr[data-index=' + index + '] input[type="checkbox"]').prop('checked', true);
15                         $('tr[data-index=' + index + '] input[type="checkbox"]').next().addClass('layui-form-checked');
16                          chooseNum++;
17                     }
18                 }
19             }
20             if(len != 0 && chooseNum == len){   //表示该页全选  --  全选按钮样式回显
21                 $('input[lay-filter="layTableAllChoose"]').prop('checked',true);
22                 $('input[lay-filter="layTableAllChoose"]').next().addClass('layui-form-checked');
23             }
24         },
25         cols: colArr
26     });
27 });

这里实现在翻页的时候,将已勾选的数据行样式回显,如果全选就将全选样式回显为选中状态。

done 中获取当前页的数据条数  -->  var len = res.data.length;

定义一个记录当前页回显为选中状态的数据行条数的记录数  -->  var chooseNum = 0;

for循环,循环 len 次,并遍历 idMap,如果当前页的 pageDataIdMap 中与 idMap 有相同 key 的数据,则回显为勾选状态

 

res.data[i]["LAY_CHECKED"]='true';
var index= res.data[i]['LAY_TABLE_INDEX'];
$('tr[data-index=' + index + '] input[type="checkbox"]').prop('checked', true);
$('tr[data-index=' + index + '] input[type="checkbox"]').next().addClass('layui-form-checked');

并且 chooseNum 进行 +1
chooseNum = len 并且 len != 0 时,表示当前页的数据都是选中状态,所以全选按钮也要回显为选中状态
$('input[lay-filter="layTableAllChoose"]').prop('checked',true);
$('input[lay-filter="layTableAllChoose"]').next().addClass('layui-form-checked');


到这里,多选、全选与翻页勾选就已经实现。
接下来就是点击按钮实现批量操作(我这边是 批量提交)
1 <div class="parentAdd demoTable">
2     <a class="layui-btn layui-btn-normal layui-btn-xs" data-type="getCheckData" style="font-size: 14px; margin-top:6px;padding-top: 12px; height: 24px; width: 80px; line-height: 0px; vertical-align: top;">提交委托单
3     </a>
4 </div>
 1 layui.use(['layer', 'jquery', 'table'], function() {    
 2     var active = {
 3         getCheckData: function(){
 4             //你的JS方法
 5         }
 6     };
 7     $('.demoTable .layui-btn').on('click', function(){
 8         var type = $(this).data('type');
 9         active[type] ? active[type].call(this) : '';
10     });
11 });

 

 

完整代码如下:

HTML代码:

 1 <div class="table_mian" style="position: absolute;width: 100%;top: 124px;bottom: 0;left: 0;border: 1px solid #dedede;">
 2     <div class="bgtop">
 3         <a href="#" style="color: #4c4c4c;font-size: 15px;line-height: 36px;padding-left: 10px;"><i class="fa fa-table zt" style="padding-right: 6px;"></i>见证取样信息</a>
 4          <div class="parentAdd demoTable">
 5              <a class="layui-btn layui-btn-normal layui-btn-xs" data-type="getCheckData" style="font-size: 14px; margin-top:6px;padding-top: 12px; height: 24px; width: 80px; line-height: 0px; vertical-align: top;">提交委托单</a>
 6         </div>
 7     </div>
 8     <div style="padding: 10px;">
 9          <table class="layui-hide layui-table" id="jzqyListTable" lay-size="sm" lay-filter="demo"></table>
10     </div>
11 </div>

JS代码:

var pageDataIdMap;
var idMap = new Map();

$(function() {
    layui.use(['layer', 'jquery', 'table'], function() {
        table.render({
            page: {},
            done: function (res, curr, count) {
                var len = res.data.length;
                pageDataIdMap = new Map();
                for(var i = 0;i < len;i++){   //填充当前页的数据
                    pageDataIdMap[res.data[i].id] = res.data[i].id;
                }
                var chooseNum = 0;   //记录当前页选中的数据行数
                for(var i = 0;i < len;i++){   //勾选行回显
                    for(var key in idMap){
                        if(res.data[i].id == key){
                            res.data[i]["LAY_CHECKED"]='true';
                            //找到对应数据改变勾选样式,呈现出选中效果
                            var index= res.data[i]['LAY_TABLE_INDEX'];
                            $('tr[data-index=' + index + '] input[type="checkbox"]').prop('checked', true);
                            $('tr[data-index=' + index + '] input[type="checkbox"]').next().addClass('layui-form-checked');
                            chooseNum++;
                        }
                    }
                }
                if(len != 0 && chooseNum == len){   //表示该页全选  --  全选按钮样式回显
                $('input[lay-filter="layTableAllChoose"]').prop('checked',true);
                $('input[lay-filter="layTableAllChoose"]').next().addClass('layui-form-checked');
                }
            },
            cols: colArr
        });

        table.on('checkbox(demo)', function(obj){
            if(obj.type == 'one'){    //单选操作
                if(obj.checked){     //选中
                    idMap[obj.data.id] = obj.data.id;
                }else{      //取消选中
                    for(var key in idMap){
                        if(key == obj.data.id){   //移除取消选中的id
                            delete idMap[obj.data.id];
                        }
                    }
                }
            }else{      //全选操作
                if(obj.checked){    //选中
                    for(var pageKey in pageDataIdMap){
                        idMap[pageKey] = pageKey;
                    }
                }else{     //取消选中
                    for(var pageKey in pageDataIdMap){
                        for(var key in idMap){
                            if(key == pageKey){
                                delete idMap[pageKey];
                            }
                        }
                    }
                }
            }
        });

        var active = {
            getCheckData: function(){
                batchSubmitWt();
            }
        };

        $('.demoTable .layui-btn').on('click', function(){
            var type = $(this).data('type');
            active[type] ? active[type].call(this) : '';
         });

    });
});

function batchSubmitWt() {
    var ids = "";
    for(var key in idMap){
        ids += key + ",";
    }
    if(ids == ''){
        layer.open({title:'提示',content:'请勾选要提交的委托单'});
        return false;
    }
    ids = ids.slice(0,-1);
    $.ajax({
        type : "POST",
        url : '../jzqy/batchSubmitWt',
        data : {
            'id' : ids
        },
        dataType : "json",
        success: function (data) {
            if(data.status == 'success'){
                table.reload('jzqyListTable', {
                    where: {},
                    page: {
                        curr: 1 //重新从第 1 页开始
                    }
                });
            }
        }
    });
} 

 

 
posted @ 2020-01-09 10:53  搬块砖可以吗  阅读(7980)  评论(7编辑  收藏  举报