原文地址;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分批异步加载方式下实现节点搜索功能(转载)的更多相关文章

  1. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载

     在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一 ...

  2. 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/ ...

  3. zTree设置异步加载后展开

    //不能直接配置展开属性 因为没有数据,需要添加回调函数,异步加载成功展开 callback: { onAsyncSuccess: zTreeOnAsyncSuccess } //异步加载成功回调函数 ...

  4. ztree的异步加载

    js中代码为: //参数设置: var setting = { async: { enable: true,    url:"<%=path%>/role/getTreeData ...

  5. 运用requirejs的异步加载方式

    很容易让人以为是权重出问题了,但就我自己多个项目动画导出的经验来看,大 我们说程序员核心能力有以下几点:自学能力,解决问题的能力,团队合作能力.自学可以让我们在这个日新月异的时代不被淘汰;解决问题可以 ...

  6. zTree异步加载展开第一级节点

    在 setting 中的 callback 中加上 onAsyncSuccess:onAsyncSuccess 回调函数 , 然后实现回调函数 var isFirst = true;function ...

  7. Ztree异步加载自动展开节点

    在Ztree的官网Demo中,有自动展开的例子,是通过设置节点属性open:true来实现自动展开的,但是在异步加载中,这个属性设置为true也不会自动展开,因为open:true是指在有子节点的情况 ...

  8. JS异步加载的三种方式

    js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作. 有些工具方法需要按需加载,用到再加载,不用不加载,. 默认正常 ...

  9. 点评js异步加载的4种方式

    主要介绍了点评js异步加载的4种方式,帮助大家更全面的了解js异步加载方式,感兴趣的小伙伴们可以参考一下 js异步加载的4种方式,点评开始. <!DOCTYPE html> <htm ...

随机推荐

  1. 20155208 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155208 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 打开windows下的 ...

  2. 并发编程-TPL

    并发编程-TPL 本节导航 基本概念 并发编程 TPL 线程基础 windows为什么要支持线程 线程开销 CPU的发展 使用线程的理由 如何写一个简单Parallel.For循环 数据并行 Para ...

  3. 通过更改服务器解决双系统ubuntu时间+8

    安装ntpdate: sudo apt-get install ntpdate 设置校正服务器: sudo ntpdate time.windows.com 设置硬件时间为本地时间: sudo hwc ...

  4. eclipse操作(备忘)

    myecplise破解   https://blog.csdn.net/by_xiaobai007/article/details/81177367 1.查看类路径 2.建立模板 window--pr ...

  5. nginx实现反向代理,以反向代理tomcat为例

    我的nginx和tomcat在同一台服务器上 我nginx安装的位置(因为我安装时使用的是./configure --prefix=/usr/etc/nginx)是/usr/etc/nginx,进入安 ...

  6. skipper prometheus 监控

    skipper 是支持prometheus监控的,只是没有启用,需要添加参数 -enable-prometheus-metrics 测试使用的是一个简单nginx web ,同时使用docker-co ...

  7. 普林斯顿数学指南(第二卷) (Timothy Gowers 著)

    第IV部分 数学的各个分支 IV.1 代数数 IV.2 解析数论 IV.3 计算数论 IV.4 代数几何 IV.5 算术几何 IV.6 代数拓扑 IV.7 微分拓扑 IV.8 模空间 IV.9 表示理 ...

  8. Redis Cluster 4.0高可用集群安装、在线迁移操作记录

    之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...

  9. es高级部分

    1 关于机器 配置. 内存:上亿的数据一般需要64G内存的服务器.劲量不要使用小于32G 内存的服务器. cpu:es 对cpu 要求依赖不如内存.一般要求2-8 核就可以了. 磁盘:es 对磁盘依赖 ...

  10. Springboot配置文件映射

    添加类和配置文件的映射: 1.定义映射类 @Component @PropertySource("classpath:config/XX.properties") public c ...