美文网首页
Layui第三方组件 treetable-lay的使用与封装

Layui第三方组件 treetable-lay的使用与封装

作者: 东本三月 | 来源:发表于2020-01-24 15:34 被阅读0次

1.说明

  • 作者发布了两个版本的组件.
    第一个是在2018年的1.0版本,基于Layui的table完成的实现
    第二个是在2019年发布2.0版本,仍然基于的Layui,但对底层进行了一定的重写,不再使用table进行实现.
    当前文章是对2.0版本的使用封装(最后更新时间2019-12-27)
    这两个版本的使用差异有些大.若使用1.0版本,可以参考https://gitee.com/stylefeng/guns的使用方式
  • 出于需求的需要,未使用官方所推荐的layui.use()相关方式进行调用.使用非模块化方式(即所有模块一次性加载)进行调用
  • 需要特别注意,在使用treeTable-lay时的数据是不进行分页的,后端接口不需要实现分页.量级大的数据最好不用tree形式展示.如果强行使用分页,显示与搜索时的效果不太理想.

2.引用

<!-- layui的样式包 -->
<link rel="stylesheet" href="${request.contextPath}/skins/layui/css/layui.css" media="all"/>

<!-- layui的js,模块化使用 -->
<!--<script type="text/javascript" src="${request.contextPath}/skins/layui/layui.js"></script>-->

<!--layui的js,可非模块化 -->
<script type="text/javascript" src="${request.contextPath}/skins/layui/layui.all.js"></script>

<!-- 基于layui的树状表格 1.0 -->
<!--<link rel="stylesheet" href="${request.contextPath}/skins/layui/treetable-lay/treetable.css" media="all"/>-->
<!--<script type="text/javascript" src="${request.contextPath}/skins/layui/treetable-lay/treetable.js"></script>-->

<!-- 基于layui的树状表格 2.0 -->
<link rel="stylesheet" href="${request.contextPath}/skins/js/treeTable/treeTable.css" media="all"/>
<script type="text/javascript" src="${request.contextPath}/skins/js/treeTable/treeTable.js"></script>

3.代码

    var layui_table_tree={
        //表格渲染结束后的树状表格对象
        tableins: null,
        //用于创建表格的参数
        table_para: {
            elem: '#table_div'
            //容器唯一 id. id 是对表格的数据操作方法上必要的传递条件
            , id: "tableTree_id"
            //请求参数
            ,para:''
            ,url:"${request.contextPath}/role/getAl"
            ,data:null  // 数据
            ,tree: {
                //是否是pid形式的数据
                isPidData:true
                // 折叠图标显示在第几列
                ,iconIndex: 1
                // 设定id的字段名
                ,idName:"id"
                //设定pid的字段名,children形式数据不需要
                , pidName:'parent_id'
                //自定义默认展开的字段名
                ,openName:'name'
            },
            cols: null
        },

        //设置表格渲染的核心参数 url和表头信息,url参数
        set_table_data: function (url, cols, para) {
            layui_table_tree.table_para.url = url;
            layui_table_tree.table_para.cols = cols;
            layui_table_tree.table_para.para = para;
        },
        //设置表格渲染的核心参数 url和表头信息,url参数,tree显示设置
        set_table_data_tree: function (url, cols, para,tree) {
            layui_table_tree.table_para.url = url;
            layui_table_tree.table_para.cols = cols;
            layui_table_tree.table_para.para = para;
            layui_table_tree.table_para.tree = tree;
        },
        //更新表格的参数
        update_table_para:function(para){
            if(para!=null){
                for(var key in para){
                    layui_table_tree.table_para[key]=para[key];
                }
            }
        },
        //通过设置的url与参数相关信息,加载tree展示需要的数据
        load_tree_data(para){
            layui_table_tree.update_table_para(para);
            var url=layui_table_tree.table_para.url;
            var para=layui_table_tree.table_para.para;

            $.ajaxSettings.async=false;
            $.getJSON(url, para,function (o) {
                if (o.code == 0) {
                    layui_table_tree.table_para.data=o.data;
                }
            });
            $.ajaxSettings.async=true;

        },
        //表格渲染
        table_render: function () {
            layui_table_tree.tableins = layui.treeTable.render(layui_table_tree.table_para);
        },
        //加载表格数据并渲染
        table_load_render:function(para){
            layui_table_tree.load_tree_data(para);
            layui_table_tree.table_render();
        },

        //表格搜索  search_para: 请求的参数
        search: function (search_para) {
            layui_table_tree.table_para.para=search_para;
            layui_table_tree.table_load_render();
        },
        // 展开全部
        expandAll:function(){
            layui_table_tree.tableins.expandAll();
        },
        //  折叠全部
        foldAll:function(){
            layui_table_tree.tableins.foldAll();
        },

        //取消复选框 父元素到子元素的联动
        closeCheckboxParentLinkage:function () {
            var nullFunc=function(){
            };
            layui_table_tree.tableins.__proto__.checkSubCB=nullFunc;
        },
        //取消复选框 全部父子联动
        closeCheckboxAllLinkage:function () {
            var nullFunc=function(){
            };
            layui_table_tree.tableins.__proto__.checkSubCB=nullFunc;
            layui_table_tree.tableins.__proto__.checkParentCB=nullFunc;
        },

        //设置点击表格行,进行选中
        click_line_checked: function () {
            // 监听行单击事件
            layui.treeTable.on('row(table_div)', function(obj){
                var tr=obj.tr;
                var input= tr.children().eq(0).find("input").next('.layui-form-checkbox')
                var input_radio= tr.children().eq(0).find("input").next('.layui-form-radio');
                input.click()
                input_radio.click();
            });
        },

        //获取当前选中行的数据
        get_checked_data: function () {
            return layui_table_tree.tableins.checkStatus()
        },
        //获取当前选中行的数据的id
        get_checked_data_id: function () {
            var table_data = layui_table_tree.get_checked_data();
            return paraGetId(table_data);
        },
        //要求选中一条数据,且返回id
        selectOne: function () {
            var table_data = layui_table_tree.get_checked_data();
            if (table_data == null) {
                layer.msg("无法获取选中数据", {icon: 2});
                return null;
            }
            if (table_data.length != 1) {
                if (table_data.length == 0) {
                    layer.msg("至少要选中一条数据", {icon: 2});
                } else {
                    layer.msg("只能选择一条数据", {icon: 2});
                }
                return null;
            }
            var one_id = paraGetOneId(table_data);
            if (one_id == null) {
                layer.msg("无法获取选中行id", {icon: 2});
                return null;
            }
            return one_id;
        },

        //要求选中多条数据,且返回id
        selectMany: function () {
            var table_data = layui_table_tree.get_checked_data();
            if (table_data == null) {
                layer.msg("无法获取选中数据", {icon: 2});
                return null;
            }
            if (table_data.length < 1) {
                layer.msg("至少要选中一条数据", {icon: 2});
                return null;
            }
            var many_id = paraGetId(table_data);
            if (many_id == null) {
                layer.msg("无法获取选中行id", {icon: 2});
                return null;
            }
            return many_id;
        },
        //设置选中
        setChecked:function (ids) {
            layui_table_tree.tableins.setChecked(ids)
        }
    }
  • 引用到的方法 paraGetOneId和paraGetId
//获取字面量数组的第一个id项
function paraGetOneId(para) {
    if (para.length == 0) {
        return null;
    } else {
        var temp = para[0];
        return temp.id;
    }
}

//获取字面量数组的id项
function paraGetId(para) {
    var ids = [];
    if (para.length == 0) {
        return null;
    }
    for (var i = 0; i < para.length; i++) {
        ids.push(para[i].id)
    }
    return ids;
}

4. 页面使用

<!doctype html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta content="always" name="referrer">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <#include "../../common/header.html">
</head>
<body>
<!--最外面的灰底框,用于与ifram区别开-->
<div class="col-xs-12 lightgray_div">
    <!--白底框-->
    <div class="col-xs-12 white_div">
        <!--搜索框-->
        <div class="col-xs-12 search_div">
            <div class="input-group g-fr">
                <form id="inquire" class="form-inline ">
                    <div class="input-group ">
                        <input type="text" class="form-control" id="name" name="name" placeholder="角色名称">
                    </div>
                    <button type="button" class="layui-btn" style="height: 30px"  id="btn_search" onclick="table_func.search()"><i
                            class="layui-icon layui-icon-search"></i></button>
                </form>
            </div>
        </div>
        <div class="col-xs-12" style="overflow:auto  " >
            <div>
                <div class="layui-table-tool" style="margin-bottom: -11px;margin-top: 10px">
                    <div class="layui-table-tool-temp">
                        <div style="margin-bottom: -5px">
                            <div class="layui-btn-container " style="float: left;">
                                <button class="layui-btn " onclick="table_func.saveRoleInfo()">
                                    <i class="layui-icon layui-icon-ok"></i>
                                    确定
                                </button>
                                <button class="layui-btn layui-btn-normal" onclick="table_func.cancel()">
                                    <i class="layui-icon layui-icon-close"></i>
                                    取消
                                </button>
                            </div>
                            <div class="layui-table-tool-self">
                                <div class="layui-inline" title="展开所有" lay-event="LAYTABLE_COLS" onclick="table_func.expandAll()" >
                                    <i class="layui-icon layui-icon-triangle-d"></i>
                                </div>
                                <div class="layui-inline" title="折叠所有" lay-event="LAYTABLE_EXPORT" onclick="table_func.foldAll()"  id="">
                                    <i class="layui-icon layui-icon-template-1"></i>
                                </div>
                                <!--<div class="layui-inline" title= lay-event="LAYTABLE_PRINT"><i class="layui-icon layui-icon-print"></i></div>-->
                            </div>
                        </div>
                    </div>
                </div>
                <table id="table_div" lay-filter="main"></table>
            </div>
        </div>
    </div>
</div>
</body>
<#include "../../common/layui_init.html">
<!--表格工具类的按钮-->
<script type="text/javascript">
    //树状表格 表头
    var cols = [
        // {type: 'checkbox'}
        {field: 'id', title: 'id', sort: true, type: 'checkbox', fixed: 'left'}
        , {field: 'name', width:"25%" ,title: '角色名称',style:' overflow: hidden;text-overflow:ellipsis;white-space: nowrap;'}
        , {field: 'code',width:"15%", title: '角色别名'}
        // , {field: 'parent_ids', title: '父级'}
        , {field: 'orderno', title: '排序号'}
        , {field: 'level', title: '层级'}
        , {field: 'remark', title: '备注'}
        , {field: 'remark', title: '备注'}
        , {
            field: 'gmt_create', title: '创建时间'
            , templet: function (col) {
                return layui_table.date_format(col.gmt_create, "yyyy-MM-dd hh:mm:ss")
            }
        },
        {
            field: 'gmt_create', title: '修改时间'
            , templet: function (col) {
                return layui_table.date_format(col.gmt_modified, "yyyy-MM-dd hh:mm:ss")
            }
        }
    ]
    //页面要用的方法
    table_func = {
        //表格初始化
        init: function () {
            layui_table_tree.set_table_data("${request.contextPath}/role/getAll",cols,$("#inquire").serialize())
            layui_table_tree.table_load_render();
        },
        //搜索
        search: function () {
            layui_table_tree.search($("#inquire").serialize())
        },
        //保存
        saveRoleInfo: function () {
            var ids=layui_table_tree.get_checked_data_id();

            $.getJSON("${request.contextPath}/user/saveRoleInfo", {userId:"${userId!?html}",roleIds:ids}, function (o) {
                if(layui_layer.ajax_verify(o)){
                    var data=o.data;
                    table_func.cancel();
                }
            });
        },
        //取消
        cancel: function () {
            var index=parent.layer.getFrameIndex(window.name);
            parent.layer.close(index);
        },
        load:function(){
            $.getJSON("${request.contextPath}/role/getRoleIdByUserId", {userId:"${userId!?html}"}, function (o) {
                if(layui_layer.ajax_verify_not_success_hint(o)){
                    var data=o.data;
                    layui_table_tree.setChecked(data);
                }

            });
        },
        // 展开全部
        expandAll:function(){
            layui_table_tree.expandAll();
        },
        //  折叠全部
        foldAll:function(){
            layui_table_tree.foldAll();
        }
    }
    $(function () {
        //回车点击事件 搜索
        enter_event.event_search_click();
        //树状表格渲染
        table_func.init();
        //取消 父复选框到子复选框的联动
        layui_table_tree.closeCheckboxAllLinkage();
        //设置点击表格行,进行选中
        layui_table_tree.click_line_checked()
        table_func.load();
    });
</script>
<#include "../../common/footer-inner.html">
</html>

5.展示效果

  • 待补充

6.还需完善的地方

  • 暂不能实现一个页面展示两个表格.因为创建的是同一个表格对象
  • 在表格文本比较长的时候,可能会没有原table的省略效果,造成表格样式出错.暂时的解决方法是在col上增加style:' overflow: hidden;text-overflow:ellipsis;white-space: nowrap;'

相关文章

网友评论

      本文标题:Layui第三方组件 treetable-lay的使用与封装

      本文链接:https://www.haomeiwen.com/subject/wckbzctx.html