JS组件系列——自己动手封装bootstrap

Stella981
• 阅读 683

具体使用见转载地址!

由于在使用过程中,出现了一点问题,所以在这里记录下来。

先看html代码:

<script type="text/javascript">
    $(document).ready(function () {
            $('.tree').treegridData({
                id: 'permissionId',
                parentColumn: 'parentPermissionId',
                type: "GET", //请求数据的ajax类型
                url: 'list',   //请求数据的ajax的url
                ajaxParams: {}, //请求数据的ajax的data属性
                expandColumn: null,//在哪一列上面显示展开按钮
                striped: true,   //是否各行渐变色
                bordered: true,  //是否显示边框
//                 expandAll: false,  //是否全部展开
                columns: [
                    {
                        title: '菜单名',
                        field: 'permissionName'
                    },
                    {
                        title: '菜单描述',
                        field: 'description'
                    },
                    {
                        title: '创建时间',
                        field: 'gmtCreate'
                    },
                    {
                        title: '最近修改时间',
                        field: 'gmtCreate'
                    }
                ]
            });
        });
    </script>

jquery.treegrid.extension.js文件代码:

(function ($) {
    "use strict";

    $.fn.treegridData = function (options, param) {
        //如果是调用方法
        if (typeof options == 'string') {
            return $.fn.treegridData.methods[options](this, param);
        }
        
        //如果是初始化组件
        options = $.extend({}, $.fn.treegridData.defaults, options || {});
        var target = $(this);
        //debugger;
        //得到根节点
        target.getRootNodes = function (data) {
            var result = [];
            $.each(data, function (index, item) {
                if (!item[options.parentColumn]) {
                    result.push(item);
                }
            });
            return result;
        };
        var j = 0;
        //递归获取子节点并且设置子节点
        target.getChildNodes = function (data, parentNode, parentIndex, tbody) {
            var log;
            $.each(data, function (i, item) {
                if (item[options.parentColumn] == parentNode[options.id]) {
                    var tr = $('<tr></tr>');
                    var nowParentIndex = item[options.id];
                    tr.addClass('treegrid-' + nowParentIndex);
                    tr.addClass('treegrid-parent-' + parentIndex);
                    $.each(options.columns, function (index, column) {
                        var td = $('<td></td>');
                        td.text(item[column.field]);
                        tr.append(td);
                    });
                    tbody.append(tr);
                    target.getChildNodes(data, item, nowParentIndex, tbody)
                }
            });
        };
        target.addClass('table');
        if (options.striped) {
            target.addClass('table-striped');
        }
        if (options.bordered) {
            target.addClass('table-bordered');
        }
        if (options.url) {
            $.ajax({
                type: options.type,
                url: options.url,
                data: options.ajaxParams,
                dataType: "JSON",
                success: function (data, textStatus, jqXHR) {
                    //debugger;
                    //构造表头
                    var thr = $('<tr></tr>');
                    $.each(options.columns, function (i, item) {
                        var th = $('<th style="padding:10px;"></th>');
                        th.text(item.title);
                        thr.append(th);
                    });
                    var thead = $('<thead></thead>');
                    thead.append(thr);
                    target.append(thead);

                    //构造表体
                    var tbody = $('<tbody></tbody>');
                    var rootNode = target.getRootNodes(data.page.list);
                    $.each(rootNode, function (i, item) {
                        var tr = $('<tr></tr>');
                        var tempTreeGrid = item.permissionId;
                        tr.addClass('treegrid-' + tempTreeGrid);
                        $.each(options.columns, function (index, column) {
                            var td = $('<td></td>');
                            td.text(item[column.field]);
                            tr.append(td);
                        });
                        tbody.append(tr);
                        target.getChildNodes(data.page.list, item, tempTreeGrid, tbody);
                    });
                    target.append(tbody);
                    target.treegrid({
                        expanderExpandedClass: options.expanderExpandedClass,
                        expanderCollapsedClass: options.expanderCollapsedClass
                    });
                    if (!options.expandAll) {
                        target.treegrid('collapseAll');
                    }
                }
            });
        }
        else {
            //也可以通过defaults里面的data属性通过传递一个数据集合进来对组件进行初始化....有兴趣可以自己实现,思路和上述类似
        }
        return target;
    };

    $.fn.treegridData.methods = {
        getAllNodes: function (target, data) {
            return target.treegrid('getAllNodes');
        },
        //组件的其他方法也可以进行类似封装........
    };

    $.fn.treegridData.defaults = {
        id: 'Id',
        parentColumn: 'ParentId',
        data: [],    //构造table的数据集合
        type: "GET", //请求数据的ajax类型
        url: null,   //请求数据的ajax的url
        ajaxParams: {}, //请求数据的ajax的data属性
        expandColumn: null,//在哪一列上面显示展开按钮
        expandAll: true,  //是否全部展开
        striped: false,   //是否各行渐变色
        bordered: false,  //是否显示边框
        columns: [],
        expanderExpandedClass: 'glyphicon glyphicon-chevron-down',//展开的按钮的图标
        expanderCollapsedClass: 'glyphicon glyphicon-chevron-right'//缩起的按钮的图标
        
    };
})(jQuery);

这里主要说下jquery.treegrid.extension.js文件,原本按照原作者的代码是可以实现树形table的,但是遇到一个坑爹的问题,就是层级不对,我的数据层级本身应该是如下这种:

-系统设置(1级目录)

   -用户管理(2级目录)

   -添加用户(3级目录)

-代码管理(1级目录)

   -代码生成(2级目录)

        -代码详细(3级目录)

实际的效果如下:

-系统设置(1级目录)

   -用户管理(2级目录)

   -添加用户(3级目录)

        -代码详细(3级目录)

-代码管理(1级目录)

   -代码生成(2级目录)

首先确认,数据层级关系肯定是没问题的。那么可能就是jquery.treegrid.extension.js这个文件的问题了。

经过查看发现,层级的关系是依靠  var j = 0;  来设置的,然后debug代码后发现,确实这个参数导致的层级不对。后将层级用数据的id和parentId来进行设置,见如下代码片段:

//递归获取子节点并且设置子节点
        target.getChildNodes = function (data, parentNode, parentIndex, tbody) {
            var log;
            $.each(data, function (i, item) {
                if (item[options.parentColumn] == parentNode[options.id]) {
                    var tr = $('<tr></tr>');
                    var nowParentIndex = item[options.id];
                    tr.addClass('treegrid-' + nowParentIndex);
                    tr.addClass('treegrid-parent-' + parentIndex);
                    $.each(options.columns, function (index, column) {
                        var td = $('<td></td>');
                        td.text(item[column.field]);
                        tr.append(td);
                    });
                    tbody.append(tr);
                    target.getChildNodes(data, item, nowParentIndex, tbody)
                }
            });
        };

//构造表体
                    var tbody = $('<tbody></tbody>');
                    var rootNode = target.getRootNodes(data.page.list);
                    $.each(rootNode, function (i, item) {
                        var tr = $('<tr></tr>');
                        var tempTreeGrid = item.permissionId;
                        tr.addClass('treegrid-' + tempTreeGrid);
                        $.each(options.columns, function (index, column) {
                            var td = $('<td></td>');
                            td.text(item[column.field]);
                            tr.append(td);
                        });
                        tbody.append(tr);
                        target.getChildNodes(data.page.list, item, tempTreeGrid, tbody);
                    });

完美解决!

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java中ajax的用法简单案例
1.index.html<!DOCTYPEhtml<html<head<metacharset"UTF8"<titleInserttitlehere</title<scripttype"text/javascript"src"js/jquery2.1.0.js"
Wesley13 Wesley13
3年前
JS导出页面为PDF文件,该如何操作?来看一眼就明白啦!
废话不多说,直接上代码。1.资源文件或依赖<scripttype"text/javascript"src"https://my.oschina.net//u/4265132/blog/4054317/js/canvg2.js"</script<scripttype"text/javascript"src"https://m
Wesley13 Wesley13
3年前
JS的另类写法(书签栏工具原型)
<scripttype"text/javascript"javascript:void(function(version){varscriptTagdocument.createElement('script');scriptTag.type'text/javascript';
Stella981 Stella981
3年前
Html5添加三联切换仿3D效果旋转木马jQuery插件教程
一、使用方法<script type"text/javascript" src"js/jquery.min.js"</script<script type"text/javascript" src"js/gallery.js"</script   二、Html结构<div id"wrapper"<div id"mai
Stella981 Stella981
3年前
FusionChart的饼图和柱状图
1、JSP页面<%@pagelanguage"java"pageEncoding"UTF8"contentType"text/html;charsetUTF8"%<scripttype"text/javascript"$(function(){$('gys').combobo
Easter79 Easter79
3年前
TP5+layui表格使用(更新中)
<tableclass"layuihide"id"category"</table<scripttype"text/javascript"src"__PLUGINS__/axios/axios.min.js"</script<scripttype"text/javascr
Stella981 Stella981
3年前
Jquery从入门到放弃(八)
杂项:一、noConflict()为防止简写符号‘$’和其他JS库发生冲突,执行此语句后,jquery会释放出"$"符号,自己使用jquery全称$.noConflict();jQuery(document).ready(function(){jQuery("button
Wesley13 Wesley13
3年前
JS中如何防止表单重复提交问题
在登录页面html中写如下代码<scripttype"text/javascript"varissubmitfalse;functiondosubmit(){if(issubmitfalse){issub
Stella981 Stella981
3年前
JS中toFixed()方法的四舍五入问题解决方法
最近发现JS当中toFixed()方法存在一些问题,采用原生的Number对象的原型对象上的toFixed()方法时,规则并不是所谓的“四舍五入”。原文见  https://www.cnblogs.com/wangsaiming/p/4644790.html<scripttype"text/javascript"Numbe