- 发现 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; } });