zTree分批异步加载方式下实现节点搜索功能(转载)
原文地址;https://segmentfault.com/a/1190000004657854
最近公司做一个项目用到zTree,zTree功能强大就不用多说了,相信用过的人都知道。
公司项目因为要展示的节点非常多,所以要求要实现搜索节点的功能,zTree确实很强大,它提供了getNodesByParamByFuzzy(key, value, parentNode)方法可根据关键字进行模糊查询得到想要的节点,极其方便。但是问题来了,因为要读取节点的数据量很大,节点的数量有几万个甚至更多,考虑到性能和时间上的问题,因此不能一次性把全部节点数据读取出来,这里我采用的是zTree自带的分批异步加载模式。但是这样就又造成了另外一个问题,再使用getNodesByParamByFuzzy这个方法时便只能找到已经加载出来的节点,而无法找到还没有进行加载的节点,从而使用户体验不好。
为了解决这个问题,刚开始的想法是每次都去数据库查询数据,每次只显示搜索到的第一条结果,然后再进行下一条查询,查到最后一条时又返回第一条,事实这样的思路是行的通的,但是这样实现起来非常麻烦,而在项目中通常都不止一棵树,难不成每棵树都要这样,为了这小小的功能却要写如此多的代码实在恶心,废话不多说,下面是我自己想的认为比较好的方法。看下面代码:
// 节点加载完的回调函数,加载方式依旧是分批加载,但是不是等用户展开节点才去加
// 载,而是让它自动完成加载,这里不好的地方是依旧要加载全部数据,所以必须等待
// 它加载完才能使用搜索功能
function onAsyncSuccess(event, treeId, treeNode, msg) {
var zTreeObj = $.fn.zTree.getZTreeObj();
// 这个方法是将标准 JSON 嵌套格式的数据转换为简单 Array 格式
var nodes = zTreeObj.transformToArray(zTreeObj.getNodes());
for (var i = 0; i < nodes.length; i++) {
// 判断节点是否已经加载过,如果已经加载过则不需要再加载
if (!nodes[i].zAsync) {
zTreeObj.reAsyncChildNodes(nodes[i], '', true);
}
}
}
所以还必须定义多一个判断树节点是否已经全部加载完的方法。这个方法我是参考《精通JavaScript》上面关于等待页面加载完的方法来写的
function treeAsyncReady(treeId, f) {
// 如果树已经加载完,马上执行函数
if (treeAsyncReady.done) {
return f();
} var zTreeObj = $.fn.zTree.getZTreeObj(); treeAsyncReady.timer = setInterval(function() {
if (treeAsyncReady.done) {
return false;
} // 获取没有异步加载过的节点
var nodes = zTreeObj.getNodesByFilter(funciton(node) {
return !node.zAsync;
});
// 如果节点数为零则说明已经加载完
if (nodes.length == 0) {
clearInterval(treeAsyncReady.timer);
treeAsyncReady.timer == null; // 执行函数
f(); treeAsyncReady.done = true;
}
}, 13);
}
定义了这个方法,然后就可以在这个方法实现实现你要搜索的功能了
treeAsyncReady('treeId', function() {
// 在这里写搜索节点的代码
...
});
zTree分批异步加载方式下实现节点搜索功能(转载)的更多相关文章
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载
在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一 ...
- ztree插件异步加载 使用RESTEasy报错 Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.
在使用ztree插件实现异步加载时遇到后台RESTEasy接收参数问题,查看后台报错: A servlet request to the URI http://localhost:8080/area/ ...
- zTree设置异步加载后展开
//不能直接配置展开属性 因为没有数据,需要添加回调函数,异步加载成功展开 callback: { onAsyncSuccess: zTreeOnAsyncSuccess } //异步加载成功回调函数 ...
- ztree的异步加载
js中代码为: //参数设置: var setting = { async: { enable: true, url:"<%=path%>/role/getTreeData ...
- 运用requirejs的异步加载方式
很容易让人以为是权重出问题了,但就我自己多个项目动画导出的经验来看,大 我们说程序员核心能力有以下几点:自学能力,解决问题的能力,团队合作能力.自学可以让我们在这个日新月异的时代不被淘汰;解决问题可以 ...
- zTree异步加载展开第一级节点
在 setting 中的 callback 中加上 onAsyncSuccess:onAsyncSuccess 回调函数 , 然后实现回调函数 var isFirst = true;function ...
- Ztree异步加载自动展开节点
在Ztree的官网Demo中,有自动展开的例子,是通过设置节点属性open:true来实现自动展开的,但是在异步加载中,这个属性设置为true也不会自动展开,因为open:true是指在有子节点的情况 ...
- JS异步加载的三种方式
js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作. 有些工具方法需要按需加载,用到再加载,不用不加载,. 默认正常 ...
- 点评js异步加载的4种方式
主要介绍了点评js异步加载的4种方式,帮助大家更全面的了解js异步加载方式,感兴趣的小伙伴们可以参考一下 js异步加载的4种方式,点评开始. <!DOCTYPE html> <htm ...
随机推荐
- 20155208 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155208 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 打开windows下的 ...
- 并发编程-TPL
并发编程-TPL 本节导航 基本概念 并发编程 TPL 线程基础 windows为什么要支持线程 线程开销 CPU的发展 使用线程的理由 如何写一个简单Parallel.For循环 数据并行 Para ...
- 通过更改服务器解决双系统ubuntu时间+8
安装ntpdate: sudo apt-get install ntpdate 设置校正服务器: sudo ntpdate time.windows.com 设置硬件时间为本地时间: sudo hwc ...
- eclipse操作(备忘)
myecplise破解 https://blog.csdn.net/by_xiaobai007/article/details/81177367 1.查看类路径 2.建立模板 window--pr ...
- nginx实现反向代理,以反向代理tomcat为例
我的nginx和tomcat在同一台服务器上 我nginx安装的位置(因为我安装时使用的是./configure --prefix=/usr/etc/nginx)是/usr/etc/nginx,进入安 ...
- skipper prometheus 监控
skipper 是支持prometheus监控的,只是没有启用,需要添加参数 -enable-prometheus-metrics 测试使用的是一个简单nginx web ,同时使用docker-co ...
- 普林斯顿数学指南(第二卷) (Timothy Gowers 著)
第IV部分 数学的各个分支 IV.1 代数数 IV.2 解析数论 IV.3 计算数论 IV.4 代数几何 IV.5 算术几何 IV.6 代数拓扑 IV.7 微分拓扑 IV.8 模空间 IV.9 表示理 ...
- Redis Cluster 4.0高可用集群安装、在线迁移操作记录
之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...
- es高级部分
1 关于机器 配置. 内存:上亿的数据一般需要64G内存的服务器.劲量不要使用小于32G 内存的服务器. cpu:es 对cpu 要求依赖不如内存.一般要求2-8 核就可以了. 磁盘:es 对磁盘依赖 ...
- Springboot配置文件映射
添加类和配置文件的映射: 1.定义映射类 @Component @PropertySource("classpath:config/XX.properties") public c ...