BootstrapTable-treegrid(树形表格)扩展

一、说明:

参考 封装bootstrap-treegrid组件 https://www.cnblogs.com/Leo_wl/p/6794449.html#_labelTop 

文章是对bootstrap-treegrid调用的封装,由于业务需要,需要增加很多功能,比如类似Bootstraptable.js中的 列的align,width,formatter相关功能以及onLoadSuccess()事件等等,原来的无法满足,故在大神的基础之上做了一些改动,并修改了一个bug(<tr class=treegrid-n></tr>会串号,导致层级显示有问题) 仅供大家参考。

二、效果图

下图为生成的html代码

h5手机端显示效果

三、代码

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 parentIndex = 0;
        var childIndex=100;
        //递归获取子节点并且设置子节点
        target.getChildNodes = function (data, parentNode, parentIndex, tbody,nodeLevel) {
        	nodeLevel = nodeLevel + 1;
            $.each(data, function (i, item) {
                if (item[options.parentColumn] == parentNode[options.id]) {
                    var tr = $('<tr></tr>');
                    childIndex++;
                    var nowParentIndex = (parentIndex + (childIndex + 1));
                    tr.addClass('treegrid-' + nowParentIndex);
                    tr.addClass('treegrid-parent-' + parentIndex);
                    $.each(options.columns, function (index, column) {
                    	var align="left";
                    	if(column.align){
                    		align=column.align;
                    	}
                    	var td = $('<td style="text-align:'+align+';"></td>');
                    	
                    	if(column.width){
                    		td = $('<td style="text-align:'+align+';width: '+column.width+'px;"></td>');
                    	}
                    	
                    	var value = item[column.field];
                        if(column.formatter){
                        	var fn = column.formatter;
                        	 if (typeof fn == 'function') {
                        		 td.html(fn(value,i,item,nodeLevel));
				                }
                        }else{
                        td.text(value);
                        }
                        tr.append(td);
                    });
                    tbody.append(tr);
                    target.getChildNodes(data, item, nowParentIndex, tbody,nodeLevel)
                    
                }
            });
        };
        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 nodeLevel = 1;
                    //构造表头
                    var thr = $('<tr></tr>');
                    $.each(options.columns, function (i, item) {
                    	var align="left";
                    	if(item.align){
                    		align=item.align;
                    	}
                        var th = $('<th style="text-align:'+align+';"></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);
                    $.each(rootNode, function (i, item) {
                        var tr = $('<tr></tr>');
                        parentIndex++;
                        var parentNodeIndex= parentIndex + i;
                        tr.addClass('treegrid-' + parentNodeIndex);
                        $.each(options.columns, function (index, column) {
                        	var align="left";
                        	if(column.align){
                        		align=column.align;
                        	}
                        	var td = $('<td style="text-align:'+align+';"></td>');
                        	
                        	if(column.width){
                        		td = $('<td style="text-align:'+align+';width: '+column.width+'px;"></td>');
                        	}
                        	
                        	var value = item[column.field];
                            if(column.formatter){
                            	var fn = column.formatter;
                            	 if (typeof fn == 'function') {
                            		 td.html(fn(value,i,item,nodeLevel));
					                }
                            }else{
                            td.text(value);
                            }
                            tr.append(td);
                        });
                        tbody.append(tr);
                        target.getChildNodes(data, item, parentNodeIndex, tbody,nodeLevel);
                    });
                    target.append(tbody);
                    target.treegrid({
                        expanderExpandedClass: options.expanderExpandedClass,
                        expanderCollapsedClass: options.expanderCollapsedClass
                    });
                    if (!options.expandAll) {
                        target.treegrid('collapseAll');
                    }
                    if(options.onLoadSuccess){
                    	options.onLoadSuccess();
                    }
                }
            });
        }
        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-triangle-bottom',//展开的按钮的图标
        expanderCollapsedClass: 'glyphicon glyphicon-triangle-right',//缩起的按钮的图标
    };
})(jQuery);

业务调用代码

$('#leaderGroupTable').treegridData({
				                id: 'quotaId',
				                parentColumn: 'parentQuotaId',
				                type: "POST", //请求数据的ajax类型
				                url: '/listLeadersQuotaDetailForTreeGrid',   
				                ajaxParams: {leaderId : leaderId,
									uuid : uuid,
									yearDetailId : yearDetailId,}, 
				                expandColumn: null,//在哪一列上面显示展开按钮
				                striped: true,   
				                bordered: false,  
				                //expandAll: false,  
				                columns: [
				                    {
				                        title: '指标名称',
				                        field: 'quotaName',
				                        width : 120,
				                        formatter : function(value,index,row,nodeLevel) {
				                        	if(1==nodeLevel){
				                        	return	value;
				                        	}else{
											return "<a class=\"showp\" data-toggle=\"popover\" data-container=\"body\"  title=\"指标说明\" "+
											" data-content="+row.quotaComments+">"+
											row.quotaName+"</a>"
				                        	}
										}
				                    },
				                    {
				                        title: '得分',
				                        field: 'score',
				                        align: 'center',
				                        width : 160,
				                        formatter : function(value,index,row,nodeLevel) {
				                        	if(1==nodeLevel){
												return "";
				                        	}else{
				                        		var comFlag =0;
												if(row.comments){
													comFlag=1
												}
												
												var status = row.fdStatus;
												var userid = row.fdUserId;
												var minusIcon = "<a href=\"javascript:subScore('"
														+ row.quotaId+"','"+uuid+"','"+leaderId+"','"+value+"','"+row.maxScore+"',"+comFlag
														+ ")\"><img src=\"/images/减2x.png\" style=\"width:25px;float:left\"></a>";
												var plusIcon = "<a href=\"javascript:addScore('"
														+ row.quotaId+"','"+uuid+"','"+leaderId+"','"+value+"','"+row.maxScore+"',"+comFlag
														+ ")\"><img src=\"/images/加2x.png\" style=\"width:25px;float:left\"></a>";
												var inputValue = "<div id='"+row.quotaId+"Value' style=\"width:30px;float:left\">"
														+ value
														+ "</div>"
												var scoreMapkey = row.quotaId;
											    initScoreMap(scoreMapkey,value,row.maxScore);
												return "<div style=\"margin-left:25%;\">"+minusIcon
														+ "&nbsp;&nbsp;"
														+ inputValue
														+ "&nbsp;&nbsp;"
														+ plusIcon+"</div>";
				                        	}
										}
				                    },
				                    {
				                        title: '加权分',
				                        field: 'maxScore',
				                        align: 'center',
				                        formatter : function(value,index,row,nodeLevel) {
				                        	if(1==nodeLevel){
												return "";
				                        	}else{
											//获取指标权重
											var val = getWeightSocre(row.score,value);
											var html = "<div id=\""+row.quotaId+"MaxScore\" class=\"sumCnt\"> "+val+"</div>";
											return html;
				                        	}
										}
				                    }
				                ],
				                onLoadSuccess : function() {
				                	initPopover();
				                }
				            });

引入的顺序

<script src="/js/treegrid/jquery.treegrid.js"></script>
<script src="/js/treegrid/jquery.treegrid.extension.js"></script>

html中的元素

<div class="table-responsive" style="margin-bottom: 35px !important;">
			<table id="leaderGroupTable"></table>
		</div>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值