jqGrid TreeGrid 加载数据 排序 扩展
- 发现 jqGrid TreeGrid 加载的数据必须要排序
- 给了两种平滑数据模式尽然不内部递归
- 所以改了下源码加了个数据二次过滤器扩展
数据本该是这样的
结果没排序成这样了 (而且还得是从根节点到子节点整体排序)
1. loadFilters: 数据过滤器扩展 (顺带把ParentId为非字符串类型导致初始化后没闭合bug解决了)
$.extend($.jgrid.defaults, {
loadFilter: function (d) { function compare(name, minor) {
return function (o, p) {
var a, b;
if (o && p && typeof o === 'object' && typeof p === 'object') {
a = o[name];
b = p[name];
if (a === b) {
return typeof minor === 'function' ? minor(o, p) : 0;
}
if (typeof a === typeof b) {
return a < b ? -1 : 1;
}
return typeof a < typeof b ? -1 : 1;
} else {
thro("error");
}
}
}
function rawdata(r, parentField) {
if (!(r instanceof Array)) {
r[parentField] = r[parentField].toString(); //转string初始化才会闭合
r['isLeaf'] = true;
return r;
}
var datatmp = [];
for (var i = 0; i < r.length; i++) {
var children = r[i]['children'];
r[i]['children'] = null;
r[i][parentField] = r[i][parentField].toString(); //转string初始化才会闭合
r[i]['isLeaf'] = !children;
datatmp.push(r[i]);
if (children) datatmp = datatmp.concat(rawdata(children, parentField));
}
return datatmp;
} var data = d.rows;
var idField, treeField, parentField, seqField, level_field;
idField = this.p.treeReader.id_field || 'id';
parentField = this.p.treeReader.parent_id_field || 'pid';
levelField = this.p.treeReader.level_field || idField//'level'
seqField = this.p.treeReader.seq_field || idField//'seq' // 注意:绑定上是显示字段用 treeField if(seqField != idField) data.sort(compare(levelField, compare(seqField)));
else data.sort(compare(seqField) ); var i, l, treeData = [], tmpMap = [];
for (i = 0, l = data.length; i < l; i++) {
tmpMap[data[i][idField]] = data[i];
}
for (i = 0, l = data.length; i < l; i++) {
if (tmpMap[data[i][parentField]] && data[i][idField] != data[i][parentField]) {
if (!tmpMap[data[i][parentField]]['children'])
tmpMap[data[i][parentField]]['children'] = [];
tmpMap[data[i][parentField]]['children'].push(data[i]);
} else {
data.sort(function (a, b) { return a[seqField] - b[seqField]; }); //从小到大排序
treeData.push(data[i]);
}
}
d.rows = rawdata(treeData, parentField);
return d;
}
});
xxoo
2. TreeGrid配置数据
"treeGrid": true,
"ExpandColumn": "Title",
"treedatatype": "json",
"treeGridModel": "adjacency", //选adjacency模式 (nested模式真zz,怎么会有这种数据格式)
"treeReader": {
"id_field": "Id", //Id 非空
"parent_id_field": "ParentId", //父节点Id 非空
"level_field": "Level", //层级 非空
"seq_field": "seq", //层级排序 可选字段 默认Id排序
//"leaf_field": "isLeaf", //叶节点过滤内已处理
},
jQuery(document).ready(function($) {
jQuery('#jqGrid').jqGrid({
"url": '@Url.Action("GetMenu", "Setup")',
"datatype": "json", //json", //data: jsondata,
"colModel":[
{ name: 'Id', "key": true, "width": 50 }, // "hidden": true,
{ lable:'PId' , name: 'ParentId', width: 70 },
{ label: '名称', name: 'Title', width: 180, },
{ label: '图标', name: 'img', width: 180 },
{ label: '地址', name: 'href', width: 300 },
{ label: '排序', name: 'seq', width: 80 },
{ label: '打开方式', name: 'Target', width: 80 },
{ label: '层级', name: 'Level', width: 80 },
{ label: '删除', name: 'IsDel', width: 80 }
],
"hoverrows":false,
"viewrecords":false,
"gridview":true,
"height":"auto",
"rowNum":100,
"scrollrows": true, //"loadonce": true,
"treeGrid": true,
"ExpandColumn": "Title",
"treedatatype": "json",
"treeGridModel": "adjacency", //选adjacency模式 (nested模式真zz,怎么会有这种数据格式)
"treeReader": {
"id_field": "Id", //Id 非空
"parent_id_field": "ParentId", //父节点Id 非空
"level_field": "Level", //层级 非空
"seq_field": "seq", //层级排序 可选字段 默认Id排序
//"leaf_field": "isLeaf", //叶节点过滤内已处理
},
"pager": "#jqGridPager"
});
});
完整绑定
3.jsGrid.js源码修改 2处
//>1 注册过滤器扩展方法
$.fn.jqGrid = function( pin ) {
if (typeof pin === 'string') {
........
}
return this.each( function() {
........
var p = $.extend(true, {
loadFilter: null, //就加这一行 ajax加载数据后二次过滤
url: "",
height: 150,
//>2 调用过滤器 搜索 case "script" 或 $.ajax
case "script":
$.ajax($.extend({
url:
........
success: function (data, st, xhr) {
if ($.isFunction(ts.p.loadFilter)) {
//添加这个if块即可 加载数据后二次过滤
data = ts.p.loadFilter.call(ts,data);
}
if ($.isFunction(ts.p.beforeProcessing)) {
.......
}
jqGrid TreeGrid 加载数据 排序 扩展的更多相关文章
- jqGrid 重新加载数据
参考:https://blog.csdn.net/u012746051/article/details/52949353 $("#列表区域id").jqGrid('clearGri ...
- MiniUI treeGrid 动态加载数据与静态加载数据的区别
说明:treegrid静态数据加载时数据结构是一棵树包含children节点集合,而采用动态加载数据时数据是List结构的具体项. 静态加载数据 test1.html <!DOCTYPE htm ...
- jqGrid首次加载时不加载任何数据
1. 首次加载时候设置 jqGrid 属性 datatype: 'local' $("#grid").jqGrid({ url:"#", datatype:&q ...
- thymeleaf-extras-db 0.0.1发布,select标签加载数据的新姿势
在写thymeleaf页面的时候,我为了偷懒,不想为每个select下拉列表框都写一个接口,于是这个懒人jar诞生了.该jar的核心功能是直接通过thymeleaf页面的自定义标签的属性,直接运行sq ...
- DevExpress的GridControl的实时加载数据解决方案(取代分页)
http://blog.csdn.net/educast/article/details/4769457 evExpress是一套第三方控件 其中有类似DataGridView的控件 今天把针对Dev ...
- ListView用法及加载数据时的闪烁问题和加载数据过慢问题
ListView介绍及添加数据时的闪烁问题 1. ListView类 1.1 ListView常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示 ...
- jquery easyui easyui-treegrid 使用异步加载数据
jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...
- 学习笔记TF049:TensorFlow 模型存储加载、队列线程、加载数据、自定义操作
生成检查点文件(chekpoint file),扩展名.ckpt,tf.train.Saver对象调用Saver.save()生成.包含权重和其他程序定义变量,不包含图结构.另一程序使用,需要重新创建 ...
- ML.NET Cookbook --- 1.如何从文本文件中加载数据?
使用ML.NET中的TextLoader扩展方法从文本文件中加载数据.你需要知道在文本文件中数据列在那里,它们的类型是什么,在文本文件中什么位置可以找到它们. 请注意:对于ML.NET只读取文件的某些 ...
随机推荐
- ES6深入浅出-1 新版变量声明:let 和 const-2.视频 let和const
以前的var方式声明不好用 a=1回声明一个全局变量, 输出了1 说明a=1确实声明了一个全局变量. 但是你把放在其他的地方,就不是声明全局变量了. 如果外面有个全局变量a 那么函数里面就是给a赋值 ...
- Vue学习笔记(三)组件间如何通信传递参数
一:父组件向子组件传递参数 <template > <div id="app"> <h1 v-text="title">&l ...
- swift 第六课 scrollview xib 的使用
现在 xib,stroyBoard 这种图形话的编辑写代码,越来越简单.以前scrollview 这样的控件不会用xib ,网上查了 好多的资料.现在把步骤逐渐的写出来, 这里顺便写个Demo ,是一 ...
- linux下maven环境的搭建
1.maven的下载 2.maven的安装和环境变量配置 系统环境linux centos7.2 x64 1.maven的下载 下载地址:https://mirrors.tuna.tsinghua.e ...
- hadoop java VM 参数设置 默认native栈大小设置
问题总结: 程序栈太小,64位机器的栈大小默认比32位的大,将程序从64放到32中执行则报错,需要修改初始堆栈大小 (.so库中提供两个函数接口,一个里面使用的是尺寸较大的图像,另一个处理的图像很小, ...
- C++11 thread condition_variable mutex 综合使用
#include <mutex> #include <condition_variable> #include <chrono> #include <thre ...
- oracle 创建新用户,授权dba
1.用有dba权限的用户登录:sys用户 2.创建一个新用户:create user abc identified by 123456; 3.授予DBA权限: grant connect,resour ...
- 更改oracle RAC public ip,vip,scan ip和private ip
更改oracle RAC public ip,vip,scan ip和private ip oifcfg - Oracle 接口配置工具 用法: oifcfg iflist [-p [-n]] ...
- 并发一:Java内存模型和Volatile
并发一:Java内存模型和Volatile 一.Java内存模型(JMM) Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和在内存中取出变量的底层细节,是围绕着 ...
- shell习题第19题:最常用的命令
[题目要求] 查看使用最多的10个命令 [核心要点] history 或者 ~/.bash_history sort uniq [脚本] #!/bin/bash # history就是调用cat ~/ ...