• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JavaScript > JS 组件系统之 bootstrap treegrid 组件封装过程

JS 组件系统之 bootstrap treegrid 组件封装过程

作者:懒得安分 字体:[增加 减小] 来源:互联网 时间:2017-05-11

懒得安分通过本文主要向大家介绍了bootstrap treegrid,js treegrid,treegrid dnd.js,jquery.treegrid.js,treegrid等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

正文

前言:最近产品需要设计一套相对完整的组织架构的解决方案,由于组织架构涉及到层级关系,在表格里面展示层级关系,自然就要用到所谓的treegrid。可惜的是,一些轻量级的表格组件本身并没有自带树形表格的功能,比如bootstrapTable就没有这个功能,怎么办呢?如果是jqgrid、easyUI的表格,treegrid的效果可以说是轻而易举就能解决,而项目目前用的就是bootstrapTable,不可能这个时候因为这个需求去换组件吧。博主分析了下,无非就两种解决方案:一种就是扩展bootstrapTable的treegrid功能;第二种就是再找一个单独的treegrid组件去实现这个功能。在网上找了下,找到了一个效果还不错的treegrid第三方组件,于是做了下封装,今天分享出来,供大家参考。

一、开源的treegrid

1、组件效果预览

最原始的效果

bootstrap样式的效果

这个是组件最原始的效果,后面会告诉大家博主做了哪些封装以及加了哪些功能。

在此还是给出一个封装过的效果吧!

2、组件开源地址

最后还是给出github上面一个开源的treegrid组件。

github开源地址:https://github.com/maxazan/jquery-treegrid

文档示例地址:http://maxazan.github.io/jquery-treegrid/

bootstrap样式的demo以及使用:http://maxazan.github.io/jquery-treegrid/examples/example-bootstrap-3.html

二、封装treegrid

1、组件封装的必要性

(1)纵观组件的所有的demo和文档,基本都是说的我们直接写死的table标签,然后通过样式去确定父子关系,最后初始化得到效果,但大部分情况下,我们的表格数据都不是写死的,而是通过后台获取数据,然后将数据渲染到前端,最终得到我们想要的效果,如果根据组件目前的使用方式,我们得到一个集合数据之后,需要自己去拼接tr、td这些东西,这都是小事,最麻烦的是组件是有父子关系的,我们需要根据我们数据之间的关系转化为组件的父子关系,并且由于支持无限级,还涉及到数据的递归运算。这个复杂的过程是我们不想经常去做的,怎么办呢?最好的思路就是封装了,封装的时候麻烦一次,以后使用就简单了,可以说这是一件一劳永逸的事情。

(2)一般来说,既然是treegrid,肯定会有表头,而这个表头是根据数据来动态显示的。组件自带的效果可以自己写死表头,但还是那句话,使用的灵活性太差。

由于以上两点,于是才有了今天的这篇文章。

2、组件封装代码示例

首先我们将treegrid组件下载并引用到我们的项目里面,然后向其目录里面加一个extension的文件夹,里面添加一个jquery.treegrid.extension.js的文件。

然后就是最重要的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) {
  $.each(data, function (i, item) {
  if (item[options.parentColumn] == parentNode[options.id]) {
   var tr = $('<tr></tr>');
   var nowParentIndex = (parentIndex + (j++) + 1);
   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);
   $.each(rootNode, function (i, item) {
   var tr = $('<tr></tr>');
   tr.addClass('treegrid-' + (j + i));
   $.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, (j + i), 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);
</div>

代码说明

1、为了避免和源组件的初始化冲突,我们自定义的组件取了一个别名,叫 treegridData 。我们使用组件的时候就通过treegridData来进行初始化,如果你觉得这个名称不顺眼,可以自行修改。

2、代码的封装思路基本是参考博主之前介绍组件的封装 http://www.weikejianghu.com/article/112472.htm这一篇里面的内容来的。

3、defaults里面就是初始化组件的时候可以传递的参数,上述注释基本上写得比较清楚。id和parentId两个参数主要是用来描述数据之间的父子级关系,后面我们介绍组件时候的时候你一看就能明白。

4、博主加了几个自认为很有用的属性和方法,应该能减少一些使用的麻烦。比如初始化组件的时候是否展开所有的子节点、添加title、表格行的渐变色和表格边框等。

5、上述封装里面递归查找子节点的时候,每一次都需要遍历所有的数据去找子节点,效率偏低,如果你使用了类似linq to js之类的组件去操作js的集合,可以优化那部分代码,适当提高递归的效率。当然,如果你的结果集本

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • JS 组件系统之 bootstrap treegrid 组件封装过程

相关文章

  • 2017-05-11使用 NodeJS+Express 开发服务端的简单介绍
  • 2017-05-11扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
  • 2017-05-11MUI 上拉刷新/下拉加载功能实例代码
  • 2017-05-11JavaScript中利用for循环遍历数组
  • 2017-05-11vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
  • 2017-05-11微信小程序 支付功能开发错误总结
  • 2017-05-11微信小程序实战之仿android fragment可滑动底部导航栏(4)
  • 2017-05-11canvas实现简易的圆环进度条效果
  • 2017-05-11JS获得多个同name 的input输入框的值的实现方法
  • 2017-05-11微信小程序 form组件详解及简单实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
    • 聊聊JavaScript如何实现继承及特点
    • jQuery实现滚动条滚动到子元素位置(方便定位)
    • easyui 中的datagrid跨页勾选问题的实现方法
    • jQuery实现扑克正反面翻牌效果
    • Vue自定义图片懒加载指令v-lazyload详解
    • vuejs父子组件通信的问题
    • JavaScript使用链式方法封装jQuery中CSS()方法示例
    • JS实现复制功能
    • JS实现页面打印功能

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有