DataTable封装

本文详细介绍了如何对DataTable进行深度封装,包括数据加载、筛选、排序、分页等功能的实现,旨在提升前端数据展示的效率和用户体验。
摘要由CSDN通过智能技术生成
/**
 *
 * datatable.service.js
 */
(function() {
   
	'use strict';

	angular.module('oplus.commons').service('dataTableService', dataTableService);
	dataTableService.$inject = ['$localStorage'];

	function dataTableService($localStorage) {
   
		var PRECISE = 'precise', FUZZY = 'fuzzy';
		var cookiedTable = [];
		var tableOption = {
   
			/*ajax: {
				url: "", //默认为null该参数用来向DataTable指定加载的外部数据源(如果想使用现有的数据,请使用aData)可以简单的提供一个可以用来获得数据url或者JSON对象,该对象必须包含aaData,作为表格的数据源
				type: "POST",
				dataSrc: "aData"
			},*/
			"order": [],

			"autoWidth": false, //是否自动计算表格各列宽度,计算列宽会花费一些时间,如果列宽通过aoColumns传递,可以关闭该属性作为优化
			"deferRender": true, //是否启用延迟加载:当你使用AJAX数据源时,可以提升速度
			"destroy": true, //使用传递的新的初始化对象中的属性构造一个新的表格,并替换一个匹配指定的选择器的表格,如果没有匹配到表格,新的表格会被作为一个普通表格被构建
			"searching": true, //是否对数据进行过滤,数据过滤是十分灵活的,允许终端用户输入多个用空格分隔开的关键字
			"jQueryUI": false, //开关,是否启用JQueryUI风格 注意这里改变了表格的样式 排序样式都由此处控制
			"paging": true, //开关,是否显示分页器
			"processing": true, //开关,以指定当正在处理数据的时候,是否显示“正在处理”这个提示信息
			"bRestore": true,
			"retrieve": false, //使用指定的选择器检索表格
			"scrollCollapse": true, //当垂直滚动被允许的时候,DataTable会强制表格视图在任何时候都是给定的高度(对布局有利)当把数据集过滤到十分小的时候看起来会很古怪,而且页脚会留在最下面,当结果集的高度比给定的高度小时该参数会使表格高度自适应
			"serverSide": false, //配置DataTable使用服务器端处理,注意,sAjaxSource参数必须指定,以便给DataTable一个为每一行获取数据的数据源
			"stateSave": false, //开关,是否打开客户端状态记录功能。这个数据是记录在cookies中的,打开了这个记录后,即使刷新一次页面,或重新打开浏览器,之前的状态都是保存下来的
			"dbConn": "", //自定义查询参数
			"executeSql": "", //自定义查询参数
			"stateDuration": 60 * 60 * 24 * 30, // 30 days 指定用于存储客户端信息到cookie中的时间长度,超过这个时间后,自动过期
			"pageLength": 10, //用于指定一屏显示的条数,需开启分页器
			//			"aLengthMenu": [ 5, 10, 25, 50, 100 ],
			"oLanguage": {
   
				"sUrl": "vendor/datatables-1.10.15/zh_CN.json"
			}, //国际化
			"dom": '<"dataTables_header"<"dataTables_toolbar"><"dataTables_controls"RCT>f>t<"dataTables_footer row"<"col-md-6"li><"col-md-6"p>><"clearfix">',
			"scrollX": "true", //是否开启水平滚动,以及指定滚动区域大小
			//      "sScrollXInner": "100%",//开启这个页码会在水平滚动条里面
			"pagingType": "full_numbers", //分页样式
			"oColVis": {
   
				"sAlign": "left",
				"buttonText": '<button class="btn btn-sm btn-outline btn-info m-b-xxs" id="tb-btn" data-toggle="tooltip" data-placement="bottom" title="选择显示列"><i class="icon fa fa-columns"></i></button>',
				"sRestore": "Reset"
			},
			"buttons": [{
   
				extend: 'excelHtml5',
				text: '<i class="fa fa-download" title="导出excel"></i>',
				className: 'btn btn-sm btn-outline btn-info m-r-sm m-b-xxs'
			}],
			"oTableTools": {
   
				"aButtons": prepareToolButtons(null)
			},
			"createdRow": function(nRow, aData, iDataIndex) {
   
				var $row = $(nRow);
				$row.attr('id', iDataIndex);

				$row.attr('data-position', iDataIndex);
			},
			"drawCallback": function(settings) {
   
				$('.dataTables_filter input').addClass('form-control input-sm');

				//adjustColumnWidth();
			},
			"initComplete": function(settings) {
   
				//theTable.fnSetFilteringDelay(400);
				//<#-- Export -->
				this.api().columns.adjust();
				if(this.colResize) {
   
					this.colResize.redraw();
				}
				$('a[data-toggle="export"]').on('click', function(e) {
   
					e.preventDefault();
				});
				addCustomFilter();
			}
		};

		function addCustomFilter() {
   
			if ($.fn.dataTable.ext.search.length === 0) {
   
				// console.log('Add custom filter search');
				$.fn.dataTable.ext.search.push(
					function customFilter(settings, data, dataIndex) {
   
						var filter = settings._customFilter || {
   };
						if (!filter) {
   
							return true;
						}
						if (!filter.content) {
   
							return true;
						}
						var caseSensitive = !!filter.case;
						var columnIndex = filter.column;
						var toFilter = data[columnIndex];
						if (!caseSensitive) {
   
							toFilter = toFilter.toLowerCase();
						}
						var records = filter.content.split('\n');
						var match = _.find(records, function (s) {
   
							if (!caseSensitive) {
   
								s = s.toLowerCase();
							}
							if (filter.type === FUZZY) {
   
								return toFilter.indexOf(s) > -1;
							} else if (filter.type === PRECISE) {
   
								return toFilter === s;
							}
						});
						return !!match;
					}
				);
			}
		}

		//组装导出按钮和内容
		function prepareToolButtons(option) {
   
			if(option == null) {
   
				return;
			}

			var aButtons = [];
			if(option.printable) {
    //打印
				aButtons.push({
   
					"sExtends": "text",
					"sButtonText": '<i class="fa fa-external-link" data-toggle="tooltip" data-placement="bottom" title="导出"></i>',
					"fnClick": function(nnButton, oConfig, oFlash) {
   
						exportExcel(option);
					}
				});
			}

			if(!isBlank(option.id)) {
    //指定table id
				aButtons.push({
   
					"sExtends": "text",
					"sButtonText": '<i class="fa fa-refresh" data-toggle="tooltip" data-placement="bottom" title="刷新"></i>',
					"fnClick": function(nnButton, oConfig, oFlash) {
   
						refreshTable(option.id);
					}
				});
			}
			return aButtons;
		}

		//导出
		function exportExcel(option) {
   
			var form = $("<form>"); //定义一个form表单
			form.attr("style", "display:none");
			form.attr("target", "");
			form.attr("method", "post");
			form.attr("action", "/ngap/api/custom/export/datasource");
			$("body").append(form); //将表单放置在web中

			var userId = $localStorage.context.user == null ? "None" : $localStorage.context.user.id;
			var userIdInput = $("<input>");
			userIdInput.attr("type", "hidden");
			userIdInput.attr("name", userId);
			userIdInput.attr("value", "default");
			form.append(userIdInput);

			var tableId = option.id;
			var datasourceId = option.datasourceId;
			var datasourceType = option.datasourceType;

			if(!isBlank(datasourceId)) {
    //导出表格
				var datasourceIdInput = $("<input>");
				datasourceIdInput.attr("type", "hidden");
				datasourceIdInput.attr("name", "datasourceId");
				datasourceIdInput.attr("value", datasourceId);

				form.append(datasourceIdInput);
			} else if(!isBlank(datasourceType)) {
    //导出未保存的数据源

				var datasourceTypeInput = $("<input>");
				datasourceTypeInput.attr("type", "hidden");
				datasourceTypeInput.attr("name", "datasourceType");
				datasourceTypeInput.attr("value", datasourceType);
				form.append(datasourceTypeInput);

				if(datasourceType == "database") {
    //sql类型
					var dbConnInput = $("<input>");
					dbConnInput.attr("type", "hidden");
			
使用方法: 支持JAVA和PHP两种后台。 PHP:直接将WebRoot下的文件放到php服务器上直接运行即可,记得启用sqlite3。 JAVA:修改user-manage.js,将访问后台的url由"datasource.php"改为"datasource.jsp",然后将WebRoot下的文件放到tomcat下直接运行。也可使用Eclipse直接导入此项目文件。 简要说明: 使用DataTable默认的ajax交互功能,对传给后台和从后台获取的数据都有命名格式要求,这样一来耦合度较高,不利于后期扩展,不能直接适用于需要跟多种不同前端或其他业务交互的项目。本例子主要展示了自行封装请求参数和返回数据的用法,对后台的交互没有任何格式和命名限制。 基于Bootstrap 2.3.2,相关的其他插件包括图标控件FontAwesome、等待提示控件Spinjs(修改版)、弹窗控件lhgdialog(修改版) 主要展现: 封装请求参数(查询、排序、分页,不再需要data、dataFilter和dataSrc) 封装返回数据 自定义查询参数 服务器分页 自行控制和自定义遮罩效果 生成自定义效果的单元格(在线离线) 生成复选框单元格 响应复选框选择事件 生成操作按钮单元格 响应操作栏按钮点击事件 响应行点击事件 渲染回调事件(默认选中第一行) 分页栏增加跳页功能(直接修改了dataTables.bootstrap.js和dataTables.bootstrap.css) CSS实现单元格超长文字省略号显示 CSS实现单元格连续纯字母数字强制换行显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值