bootstrap table的父子表格

JS组件系列——表格组件神器:bootstrap table(二:父子表和行列调序)

前言:上篇 JS组件系列——表格组件神器:bootstrap table 简单介绍了下Bootstrap Table的基础用法,没想到讨论还挺热烈的。有园友在评论中提到了父子表的用法,今天就结合Bootstrap table的父子表和行列调序的用法再来介绍下它稍微高级点的用法。

一、效果展示

今天稍微改变下方式,先来看看实现效果,后面再介绍代码实现及注意事项。来,效果图来一发:

1、父子表效果图

2、行调序

调序前

拖动行调序到第一行

3、列调序

调序前

拖动列标题调序

调序后

二、父子表代码详解

上章我们介绍Bootstrap table基础用法的时候介绍过,初始化表格的时候有一个属性“detailView”,将它设置为true,在每行的前面即可看到一个“+”形状的图标。点击这个图标即触发加载子表格的事件。大概的原理就是如此,来看看代码,其实也很简单。

1、初始化表格,注册行展开事件

$("#tb_powerset").bootstrapTable({
		url: '/api/MenuApi/GetParentMenu',
		method: 'get',
		detailView: true,//父子表
		//sidePagination: "server",
		pageSize: 10,
		pageList: [10, 25],
		columns: [{
			field: 'MENU_NAME',
			title: '菜单名称'
		}, {
			field: 'MENU_URL',
			title: '菜单URL'
		}, {
			field: 'PARENT_ID',
			title: '父级菜单'
		}, {
			field: 'MENU_LEVEL',
			title: '菜单级别'
		}, ],
		//注册加载子表的事件。注意下这里的三个参数!
		onExpandRow: function (index, row, $detail) {
			oInit.InitSubTable(index, row, $detail);
		}
	});

还是来看看子表加载事件onExpandRow对应方法function (index, row, $detail)的三个参数,

index:父表当前行的行索引。

row:父表当前行的Json数据对象。

$detail:当前行下面创建的新行里面的td对象。

第三个参数尤其重要,因为生成的子表的table在装载在$detail对象里面的。bootstrap table为我们生成了$detail这个对象,然后我们只需要往它里面填充我们想要的table即可。

2、我们来看oInit.InitSubTable()这个方法

//初始化子表格(无线循环)
oInit.InitSubTable = function (index, row, $detail) {
	var parentid = row.MENU_ID;
	var cur_table = $detail.html('<table></table>').find('table');
	$(cur_table).bootstrapTable({
		url: '/api/MenuApi/GetChildrenMenu',
		method: 'get',
		queryParams: { strParentID: parentid },
		ajaxOptions: { strParentID: parentid },
		clickToSelect: true,
		detailView: true,//父子表
		uniqueId: "MENU_ID",
		pageSize: 10,
		pageList: [10, 25],
		columns: [{
			checkbox: true
		}, {
			field: 'MENU_NAME',
			title: '菜单名称'
		}, {
			field: 'MENU_URL',
			title: '菜单URL'
		}, {
			field: 'PARENT_ID',
			title: '父级菜单'
		}, {
			field: 'MENU_LEVEL',
			title: '菜单级别'
		}, ],
		//无线循环取子表,直到子表里面没有记录
		onExpandRow: function (index, row, $Subdetail) {
			oInit.InitSubTable(index, row, $Subdetail);
		}
	});
};

由此可以看出生成子表的原理就是创建一个table对象cur_table,然后再注册这个对象的表格初始化即可。是不是很简单~~

三、行调序代码详解

行调序的代码就更简单了,来看看。

1、需要额外引用两个js文件

<script src="~/Content/jquery-ui-1.11.4.custom/external/jquery.tablednd.js"></script>
<script src="~/Content/bootstrap-table/extensions/reorder-rows/bootstrap-table-reorder-rows.js"></script>

2、在cshtml页面定义表格时,添加两个属性

<table id="tb_order" data-use-row-attr-func="true" data-reorderable-rows="true"></table>

然后js表格初始化的时候不需要做任何修改,加载出来的表格即可实现行调序的功能。

四、列调序代码详解

和行调序类似。列调序的使用如下:

1、额外引用几个js和css

<script src="~/Content/bootstrap-table/extensions/reorder-columns/bootstrap-table-reorder-columns.js"></script>
<link rel="stylesheet" href="../assets/examples.css">
<link rel="stylesheet" href="https://rawgit.com/akottr/dragtable/master/dragtable.css">
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="https://rawgit.com/akottr/dragtable/master/jquery.dragtable.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

2、在cshtml页面定义表格时,添加一个属性

<table id="tb_departments" data-reorderable-columns="true"></table>

其他地方不用做任何修改。加载出来的表格即可实现列调序。有没有很简单。

五、控件过滤

本来这篇准备结束的,突然想起上章里面有一个搜索的功能,好像是服务端分页的时候搜索功能没法使用,于是想起之前再CS里面做过一个类似每个列过滤的功能,博主好奇心又起来了,bootstrap table是否也有这种表格每列过滤的功能,于是查看文档。结果不负所望,还真有~~我们来看看。

1、效果图展示

2、代码示例

(1)引入额外js

<script src="~/Content/bootstrap-table/extensions/filter-control/bootstrap-table-filter-control.js"></script>

(2)定义表格属性及表头属性

<table id="tb_roles" data-filter-control="true">
	  <thead>
		  <tr>
			  <th data-field="ROLE_NAME" data-filter-control="select">角色名称</th>
			  <th data-field="DESCRIPTION" data-filter-control="input">角色描述</th>
			  <th data-field="ROLE_DEFAULTURL" data-filter-control="input">角色默认页面</th>
		  </tr>
	  </thead>
  </table>

因为这里定义了表头的属性,所以,js初始化的时候就不用定义列了。

(3)js初始化

$('#tb_roles').bootstrapTable({
	url: '/Role/GetRole',
	method: 'get',
	toolbar: '#toolbar',
	striped: true,
	cache: false,
	striped: true,
	pagination: true,
	sortable: true,
	queryParams: function (param) {
		return param;
	},
	queryParamsType: "limit",
	detailView: false,//父子表
	sidePagination: "server",
	pageSize: 10,
	pageList: [10, 25, 50, 100],
	search: true,
	showColumns: true,
	showRefresh: true,
	minimumCountColumns: 2,
	clickToSelect: true,
});

最开始,博主以为这种搜索只能用户客户端分页的情况,可是经过调试发现并非如此,原来搜索的条件都能通过json传递到服务端。我们来看调试的过程

后台接收参数,并反序列化

这样我们就能将查询的条件很好地传递到后台。很好很强大啊。这样就免去了扩展表格搜索功能的烦恼~~

六、总结

以上就是bootstrap table的一些扩展应用。可能未不全面,还有一些高级用法也没有介绍,比如行、列合并,行列冻结等等。但博主相信只要有文档,使用起来应该问题不大。源码还需整理,待整理好再发上来。园友们暂且先看看!!

相关推刊
  • 《匿名收藏》 88
  • 《匿名收藏》 164
  • 《匿名收藏》 15
相关微博 ()
我来评几句
错误
登录后评论

已发表评论数(0)

没有更多评论了^^
评论加载失败, 重新加载
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bootstrap Table 中,可以使用 `data-parent-id` 和 `data-parent-field` 属性来实现表格数据的父子级关系。 1. 在数据中添加 `id` 和 `parent_id` 字段,用于标识节点的唯一标识和父节点的标识。 2. 在表格中添加 `data-parent-field="parent_id"` 属性,指定数据中父节点标识的字段名。 3. 在表格中添加 `data-id-field="id"` 属性,指定数据中唯一标识的字段名。 4. 在 `columns` 属性中,按照需要显示的列定义表格的列。 5. 在 `data` 属性中,指定表格要显示的数据。 6. 在 `onPostBody` 事件中,使用 JavaScript 对表格数据进行处理,生成父子级关系。 7. 在 `onExpandRow` 事件中,设置子表格的内容和参数。 下面是一个示例代码: ```html <table id="myTable" data-toggle="table" data-parent-field="parent_id" data-id-field="id"> <thead> <tr> <th data-field="name">名称</th> <th data-field="value">数值</th> </tr> </thead> </table> <script> var data = [ {id: 1, parent_id: null, name: '节点1', value: 100}, {id: 2, parent_id: 1, name: '节点1.1', value: 50}, {id: 3, parent_id: 1, name: '节点1.2', value: 50}, {id: 4, parent_id: null, name: '节点2', value: 200}, {id: 5, parent_id: 4, name: '节点2.1', value: 100}, {id: 6, parent_id: 4, name: '节点2.2', value: 100}, ]; $('#myTable').bootstrapTable({ columns: [{ field: 'name', title: '名称' }, { field: 'value', title: '数值' }], data: data, onPostBody: function(data) { var treeData = []; var map = {}; for (var i = 0; i < data.length; i++) { var node = data[i]; map[node.id] = i; node.children = []; } for (var i = 0; i < data.length; i++) { var node = data[i]; if (node.parent_id) { data[map[node.parent_id]].children.push(node); } else { treeData.push(node); } } $('#myTable').bootstrapTable('load', treeData); }, onExpandRow: function(index, row, $detail) { var subTable = $detail.html('<table></table>').find('table'); subTable.bootstrapTable({ columns: [{ field: 'name', title: '名称' }, { field: 'value', title: '数值' }], data: row.children }); } }); </script> ``` 这样,就可以实现父子级关系的表格了。注意,在 `onPostBody` 事件中需要对数据进行处理,生成父子级关系,然后使用 `load` 方法重新加载表格数据。在 `onExpandRow` 事件中需要设置子表格的内容和参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值