因为项目中家谱图数据量超大,而通常加载方式是经过,页面加载时 zTree.init方法进行数据加载,将全部数据一次性加载到页面中。而在项目中家谱级别又很是广而深,成千上万级,所以一次加载,彻底加载不出来。因而须要进行优化为动态加载(增量加载)的方式,以便数据加载,提升体验度。node
这应该好办,只要找到父节点单击事件,而后进行数据加载,结点附加便可。时间紧,任务重,彻底没给研究的时间。只能硬着上,随便搜索一个“zTree动态加载”,出是出来了,标题也对,可里面的代码根本没找到添加结点一说……一边是需求催,一边是没找到相似。无语……对啊,不是有官网,因而把全部api函数浏览一遍,终于发现一个叫addNodes的函数。喜!ajax
<div class="UserTree"> <ul id="treeDemo" class="ztree"></ul> </div>
<script> var zNodes; var zTree; $(function () { $.ajax({ cache: true, type: "get", url: "/User/NextLeve", async: false, success: function (data) { zNodes = data; }, error: function (data) { alert("error"); } }); zTree = ZTreeCustom.init($("#treeDemo"), setting, zNodes); zTree.expandAll(false); zTree.expandNode(zTree.getNodes()[0], true, false, true); }) var setting = { view: { nameIsHTML: true }, data: { simpleData: { enable: true }, keep: { parent: true } }, open: false, callback: { onClick: nodeClick, onExpand: function (event, treeId, treeNode) { addSubNode(treeNode); } } }; function showIconForTree(treeId, treeNode) { return !treeNode.isParent; }; function searchM() { var username = $("#txtName").val() } function nodeClick(event, treeId, treeNode, clickFlag) { addSubNode(treeNode); } function addSubNode(treeNode) { if (!treeNode.isParent) return; var s = treeNode.children; if (s != undefined) return; $.ajax({ cache: true, type: "get", url: "/User/NextLeve", data: { userId: treeNode.id }, async: true, success: function (data) { zTree.addNodes(treeNode, data); }, error: function (data) { alert("error"); } }); } </script>
其中数据来源为请求路径“/User/NextLeve?userId=xxx”,为返回以下结构的列表的json数据(即List<UserNode>类型的.ToJson()数据),其中userId可为空,为空时默认取当前登陆用户:json
public class UserNode { public long id { get; set; } public long pId { get; set; } public string name { get; set; } public bool open { get; set; } public bool isParent { get; set; } public string icon { get; set; } }
效果,则实现为单击父结点/展开父结点时动态加载子结点。后端
先查询出一级结点内容,及其对应二级结点数:api
-- 家谱图数据源 SELECT u.Id,u.UserName INTO #tempParent FROM User_User AS u WHERE u.ParentId=80 -- 父用户id SELECT u.Id,u.UserName,t.ChildCount FROM #tempParent u LEFT JOIN (SELECT p.Id,COUNT(1) ChildCount FROM T_User u INNER JOIN #tempParent p ON p.Id=u.ParentId GROUP BY p.Id ) T ON t.Id = u.Id