treegrid -表格树异步加载
问题:
机构维护时,前端框架用的是easyui,如果同步全加载会出现页面延迟严重,影响用户体验
解决:
机构逐层加载,点击后加载
逐层加载会出现一个问题:子节点只有点击后才能加载子集
所以开始为叶子节点图标,点击后变成枝节点,不点就误以为到最后一层
目前的解决办法是加载是提供状态属性,默认关闭,加载不到子集时展开状态为叶子节点图标
实现:
function initOrgMaintainDetail(versionId){
var tree = $("#orgMaintainDetail").treegrid();
var dataTree = '';
$.ajax({
url:'./fileServiceType/getOrgTreeDetail',
async:false,
data: {
Authorization: localStorage.token,
versionId:versionId
},
success:function(data){
dataTree = data;
}
});
//开始加载机构树前两层
tree.treegrid({
data:dataTree,
queryParams: {
Authorization: localStorage.token,
versionId:versionId
},
idField:'orgTypeId',
cascadeCheck:true,
treeField:'orgDesc',
fitColumns:true,
animate: true,
columns:[[
{title:'金融机构编码',field:'orgTypeId',align:'center',width:200},
{title:'金融机构名称',field:'orgDesc',width:300},
{title:'是否启用',field:'isActive',align:'center',formatter:function(value){
return value == 1?'启用':'禁用';
},width:100},
//{title:'归属人行',field:'reserved',align:'center',width:200},
{title:'归属地区',field:'areaNo',align:'center',width:150,formatter:function(value,rec){
var areaDscr ='';
$.ajax({
url:'area/find',
data:{ Authorization: localStorage.token,areaId:rec.areaNo},
type:'POST',
dataType:'JSON',
async:false,
success:function(data){
areaDscr = data.AREA_DSCR;
}
});
return areaDscr;
}},
{title:'操作',field:'operate',align:'center',width:200,
formatter:function(value,rec){
var add = "<a href='javascript:void(0);' onclick=\"openAddOrUptOrgPancyBox('" + 1 + "','"+
rec.orgTypeId + "','"+
0 + "','"+
rec.org_lvl + "','"+
1 + "','"+
0 + "','"+
0 +
"');\"><font color='#1e90ff'>新增</font></a>";
var editArea = "<a href='javascript:void(0);' onclick=\"onclickAreaPancyBox('" + rec.areaNo + "')\"><font color='#1e90ff'>地区维护</font></a><br>";
var update = "<a href='javascript:void(0);' onclick=\"openAddOrUptOrgPancyBox('" + 0 + "','"+
rec.orgTypeId + "','"+
rec.orgDesc + "','"+
rec.org_lvl + "','"+
rec.isActive + "','"+
rec.ord + "','"+
rec.areaNo +
"')\"><font color='#1e90ff'>修改</font></a>";
var batchLoad = "<a href='javascript:void(0);' onclick=\"batchImportDBMS('" + rec.ORG_ID + "','"+
rec.LVL + "','"+
rec.ORG_ID +
"')\"><font color='#1e90ff'>批量导入BMS</font></a>";
if(rec.org_lvl == 1){
return add + " " + update + " ";
}else{
return add + " " + update;
}
}
}
]],
onLoadSuccess: function (row, data) {
tree.treegrid("collapseAll");
},
onBeforeExpand:function(row){
expandNode(row,tree,versionId);
},
onDblClickRow: function (row) {
tree.treegrid('toggle',row.orgTypeId);
}
});
}
//追加子节点
function expandNode(row,tree,versionId){
$.ajax({
url: './fileServiceType/getOrgNodeChilds',
type: 'POST',
async:false,
data: {
Authorization: localStorage.token,
org_lvl: row.org_lvl,
p_Id: row.orgTypeId,
versionId:versionId
},
success: function (data) {
if(data != ''){
$.each(data, function(idx, obj) {
var node = tree.treegrid('find',obj.orgTypeId);
//该节点存在则不拼接
if(node==null){
tree.treegrid('append',{
parent: row.orgTypeId,
data: [{
orgTypeId: obj.orgTypeId,
orgDesc: obj.orgDesc,
org_lvl: obj.org_lvl,
areaNo: obj.areaNo,
isActive:obj.isActive,
ord:obj.ord,
reserved:obj.reserved,
state:obj.state
}]
});
}
});
}else{
//没有数据则更改节点状态为叶子节点
tree.treegrid('update',{
id:row.orgTypeId,
row:{
//每层都默认有子集,直到查不到子集再展开
state:'open'
}
});
}
}
});
}
节点实体类:
package org.triber.portal.model.bank; import lombok.Getter;
import lombok.Setter; import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; public class Node implements Serializable { /**
* 加载树需要列
*/
@Getter @Setter private String orgTypeId;//编号
@Getter @Setter private String orgDesc;//名字
@Getter @Setter private List<Node> children = new ArrayList<Node>();//子集
@Getter @Setter private String p_Id;
@Getter @Setter private String isActive;
@Getter @Setter private String org_lvl;//级别
@Getter @Setter private String ord;//排序
@Getter @Setter private String areaNo;
@Getter @Setter private String state = "closed";//节点状态
/**
* 信息列
*/
// @Getter @Setter private String isAdd;
// @Getter @Setter private String addOrgIdPancy;
// @Getter @Setter private String isCheckNodeId;
// @Getter @Setter private String orgId;
// @Getter @Setter private String addOrgDscrPancy;
// @Getter @Setter private String addOrgDscr1Pancy;
// @Getter @Setter private String addIsActive;
// @Getter @Setter private String nodesNum;
// @Getter @Setter private String orgLvl;
// @Getter @Setter private String lvlOrd;
// @Getter @Setter private String versionId;
// @Getter @Setter private String humanDecencyId; }
查询sql:
<select id="getOrgRootTree" resultType="org.triber.common.model.user.TreeNode">
SELECT DISTINCT
tt1.id, tt1.`NAME`, tt1.pid, CASE WHEN tt3.org_id=tt1.id THEN 1 ELSE 0 END AS isChecked,'closed' AS state,
CASE
WHEN tt1.id = tt2.ORG_TYPE_ID_1
OR tt1.id = tt2.ORG_TYPE_ID_2
OR tt1.id = tt2.ORG_ID_1
OR tt1.id = tt2.ORG_ID_2
OR tt1.id = tt2.ORG_ID_3
OR tt1.id = tt2.ORG_ID_4
OR tt1.id = tt2.ORG_ID_5 THEN
1
ELSE
0
END AS hasChecked
FROM
(
SELECT DISTINCT org_type_id_1 id, org_type_dscr_1 `NAME`, 0 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_type_id_2 id, org_type_dscr_2 `NAME`, org_type_id_1 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
) tt1
LEFT JOIN
(
SELECT findcheck.org_id, findcheck.biz_type_id, tobl.ORG_TYPE_ID_1, tobl.ORG_TYPE_ID_2, tobl.ORG_ID_1, tobl.ORG_ID_2, tobl.ORG_ID_3, tobl.ORG_ID_4, tobl.ORG_ID_5, tobl.`LEVEL` FROM dmcode.t_org_biz_lvl tobl
RIGHT JOIN
(
SELECT biz_type_id,org_id FROM comm_sys.t_biz_type_org_xref WHERE biz_type_id IS NOT NULL AND biz_type_id = #{bizTypeId}
) findcheck
ON (tobl.ORG_ID = findcheck.org_id OR findcheck.org_id = tobl.ORG_TYPE_ID_1 OR findcheck.org_id = tobl.ORG_TYPE_ID_2)
) tt2 ON (tt1.id = tt2.ORG_TYPE_ID_1 OR tt1.id = tt2.ORG_TYPE_ID_2)
LEFT JOIN (SELECT org_id FROM comm_sys.t_biz_type_org_xref WHERE biz_type_id = #{bizTypeId}) tt3 ON tt1.id = tt3.org_id
ORDER BY tt1.id
</select>
//加载子节点
<select id="getOrgTreeByParent" resultType="org.triber.common.model.user.TreeNode">
SELECT
DISTINCT tt1.id,tt1.`NAME`,tt1.pid,tt1.state,
CASE WHEN tt1.id = tt3.org_id THEN 1 ELSE 0 END AS isChecked,
CASE
WHEN tt1.id = tt2.ORG_TYPE_ID_1
OR tt1.id = tt2.ORG_TYPE_ID_2
OR tt1.id = tt2.ORG_ID_1
OR tt1.id = tt2.ORG_ID_2
OR tt1.id = tt2.ORG_ID_3
OR tt1.id = tt2.ORG_ID_4
OR tt1.id = tt2.ORG_ID_5 THEN 1
ELSE 0
END AS hasChecked
FROM (
SELECT DISTINCT
org_all.id,org_all.NAME,org_all.pid,
CASE WHEN org_all.id IN (SELECT DISTINCT parent_org_id FROM dmcode.t_org_biz_lvl WHERE parent_org_id IS NOT NULL AND parent_org_id != '') THEN 'closed' ELSE 'open' END AS state
FROM (
SELECT DISTINCT org_id_1 id,org_dscr_1 `NAME`,org_type_id_2 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_id_2 id,org_dscr_2 `NAME`,org_id_1 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_id_3 id,org_dscr_3 `NAME`,org_id_2 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_id_4 id,org_dscr_4 `NAME`,org_id_3 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_id_5 id,org_dscr_5 `NAME`,org_id_4 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
) org_all
LEFT JOIN (SELECT org_id FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}) w ON org_all.id = w.org_id
WHERE 1=1
AND org_all.id != org_all.pid
<if test="pid != null and pid != ''">
AND pid = #{pid}
</if>
<if test="areaId != null and areaId != ''">
AND org_all.AREA_NO_ID IN (SELECT AREA_NO_ID FROM dmcode.t_area_code WHERE (area_no_id_1 = #{areaId} OR area_no_id_2 = #{areaId} OR area_no_id = #{areaId} OR OLD_AREA_NO_ID = #{areaId} OR DISTRICT_CODE = #{areaId}))
</if>
) tt1
LEFT JOIN
(
SELECT
findcheck.org_id,findcheck.biz_type_id,tobl.ORG_TYPE_ID_1,tobl.ORG_TYPE_ID_2,tobl.ORG_ID_1,tobl.ORG_ID_2,tobl.ORG_ID_3,tobl.ORG_ID_4,tobl.ORG_ID_5,tobl.`LEVEL` FROM dmcode.t_org_biz_lvl tobl
RIGHT JOIN
(
SELECT biz_type_id, org_id FROM comm_sys.t_biz_type_org_xref WHERE biz_type_id IS NOT NULL AND biz_type_id = #{bizTypeId}
) findcheck
ON tobl.ORG_ID = findcheck.org_id
) tt2 ON
(
CASE
WHEN tt2.`LEVEL` = 1 THEN tt1.id = tt2.ORG_TYPE_ID_2
WHEN tt2.`LEVEL` = 2 THEN tt1.id = tt2.ORG_ID_1
WHEN tt2.`LEVEL` = 3 THEN tt1.id = tt2.ORG_ID_2
WHEN tt2.`LEVEL` = 4 THEN tt1.id = tt2.ORG_ID_3
WHEN tt2.`LEVEL` = 5 THEN tt1.id = tt2.ORG_ID_4
ELSE
tt1.id = tt2.ORG_ID
END
)
LEFT JOIN (SELECT org_id FROM comm_sys.t_biz_type_org_xref WHERE biz_type_id = #{bizTypeId}) tt3 ON tt1.id = tt3.org_id
ORDER BY tt1.id
</select>
treegrid -表格树异步加载的更多相关文章
- combotree -下拉框树异步加载
问题: 下拉树数据比较多时,全加载会产生页面延迟,需要实现异步加载 方案: 点击事件加载:先加载部分,点击节点时再展开并追加子节点 onBeforeExpand事件:在展开树前加载,感觉这种方式比较优 ...
- 多线程异步加载图片async_pictures
异步加载图片 目标:在表格中异步加载网络图片 目的: 模拟 SDWebImage 基本功能实现 理解 SDWebImage 的底层实现机制 SDWebImage 是非常著名的网络图片处理框架,目前国内 ...
- spring mvc easyui tree 异步加载树
使用spring mvc 注解 异步加载一棵树 jsp: <ul id="orgInfoTree"></ul> $(function(){ loadOrgT ...
- 玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)
关于easy ui 异步加载生成树及点击树生成选项卡,这里直接给出代码,重点部分代码中均有注释 前台: $('#tree').tree({ url: '../servlet/School_Tree?i ...
- Jquery树控件ZTree异步加载
异步加载的意思就是: 当点击展开树节点时,才去请求后台action返回点击节点的子节点数据并加载. 这里面主要设计ztree的setting变量的async属性设置: var setting = { ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增“行政区域管理”,同时大批量树采用异步加载
行政区划:简称政区,是国家为了进行分级管理而实行的区域划分.中国现行的行政区划实行如下原则:1.全国分为省.自治区.直辖市:2.省.自治区分为自治州.县.自治县.市:3.自治州分为县.自治县.市:4. ...
- ztree异步加载树节点
参考文档:https://www.cnblogs.com/tenWood/p/8620708.html ztree api地址:http://www.treejs.cn/v3/api.php 说明:j ...
- jqxtree异步加载部门树
整体思路 A.要想实现异步加载第一次加载的是一级部门 B.加载一级部门,如果有子部门,部门前面带+号,没有子部门,部门前面没有+号(+号也就是点击可以展开) C.在sql中实现如果有子部门默认都加载一 ...
- bootstrap异步加载树后样式显示问题
整个过程: 1.先加载整个页面 2.通过jquery异步请求后台返回数据 3.循环遍历数据,拼接需要的内容 4.把拼接好的数据加载到页面中. 问题: 把拼接好的内容加载到页面后,样式显示不正确.而如果 ...
随机推荐
- angularJs的过滤器扩展及自定义过滤器
一.过滤器扩展 1.过滤器的组合使用 <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta ...
- Hadoop学习之路(二十六)MapReduce的API使用(三)
影评案例 数据及需求 数据格式 movies.dat 3884条数据 1::Toy Story (1995)::Animation|Children's|Comedy 2::Jumanji (1995 ...
- Word 2019 for mac更新喽!
新的Word2019添加了许多的新功能,提供了新的文档处理方式,如改进的数字笔功能.焦点模式.学习工具和翻译,为用户提供了用于创建专业而优雅的高效文档工具,帮助用户节省时间,并得到优雅美观的结果,有效 ...
- Redis(三)内存模型
本文转载自编程迷思,原文链接 深入学习Redis(1):Redis内存模型 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可 ...
- git 从远程仓克隆到本地新分支
克隆远程仓代码到本地 git clone http://******:8080/DEV1-WMALL_DQ/WMALL_DQ_Front.git // git 库地址 当前分支是master ...
- 大话Linux内核中锁机制之信号量、读写信号量
大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实 ...
- SaltStack 自动化工具
1.服务端安装master: # yum -y install salt-master # yum -y install salt-minion 2.客户端安装minion: # yum -y ins ...
- vue组件中,iview的modal组件爬坑--modal的显示与否应该是使用v-show
这是我第一次写博客,主要是记录下自己解决问题的过程和知识的总结,如有不对的地方欢迎指出来! 需求:点击btn,弹出modal显示图表(以折现图为例) 这应该是很基本的需求也是很容易实现的,代码和效果如 ...
- 移动端触摸滑动插件Swiper使用指南
Swiper是一款开源.免费.功能十分强大的移动端内容触摸滑动插件,目前的最新版本是Swiper4.Swiper主要面向的是手机.平板电脑等移动设备,帮助开发者轻松实现触屏焦点图.触屏Tab切换.触屏 ...
- C++11 initializer_list 和 Range-based for loop 学习理解
win10 + vs2017 源码如下: int main() { vector< int > numbers = { 1, 2, 3, 4, 5 }; for (auto num : n ...