转载请注明出处:jiq•钦's technical Blog
一、需求
我有一个显示所有可用服务的树,单击服务名称就可以展开节点,显示所有对应的IP地址。
我需要同时只能显示一个服务的IP地址列表,因为不想同时刷多个服务信息,所以需要保持单一展开路径。
此外当管理员在这个界面停留时,为了能够监控当前展开服务的地址变化,需要能够定时刷这个服务的IP地址列表。
备注:对于异步加载Ztree节点,可以参考这篇文章。
二、解决方案
保持单一展开路径很简单,声明一个全局变量记录最近一次展开的节点,然后实现ZTree的beforeExpand回调函数:
var lastExpandNode = null; //保持单一展开路径 function zTreeBeforeExpand(treeId, treeNode) { var zTree = $.fn.zTree.getZTreeObj("tree"); if(lastExpandNode != null) zTree.expandNode(lastExpandNode, false); lastExpandNode = treeNode; return true; }; //ztree设置 var setting = { callback: { beforeExpand: zTreeBeforeExpand } };
beforeExpand函数中收缩上一次展开的ztree节点,然后更新最后一次展开的节点即可。
对于定时强制刷新当前展开的服务的IP地址列表,利用ztree的reAsyncChildNodes函数实现:
强行异步加载父节点的子节点。[setting.async.enable = true 时有效]
已经加载过的父节点可反复使用此方法重新加载。
请通过 zTree 对象执行此方法。
//页面加载时初始化配置树 $(document).ready(function(){ $.ajax({ type: "POST", url: "InitServiceData.action", data: "", dataType: "json", success: function(data) { var zNodes = eval("("+data+")"); zTreeObj = $.fn.zTree.init($("#tree"), setting, zNodes); }, error: function() { alert("读取服务提供者列表出错!"); } }); setInterval("periodlyFunc()", 5000); });
//刷新当前展开节点的子节点 function RefreshZTree() { if(lastExpandNode != null) { var zTree = $.fn.zTree.getZTreeObj("tree"); zTree.reAsyncChildNodes(lastExpandNode, "refresh"); } }; //jquery定时刷新函数 function periodlyFunc() { RefreshZTree(); };