对于树的节点加载有两种方法,一是同步全部加载,二是异步分批加载。
那么我们什么时候该用同步全部加载,什么时候该用异步分批加载呢?。当我们要显示的树节点不是很多的时候,应首选同步全部加载。如果我们有很多的节点要加载,并且加载时间非常的慢,这时候我们要选择异步分批加载。如果这时还用同步全部加载的话,页面加载的速度会很慢,如果数据足够多会造成页面假死现象。凡事不能说的太死,也要根据自己的实际情况来判定到底用那种方法合适。
下面介绍具体的应用,我先简述一下项目的架构,此test,用的是javaee开发的,主要是jsp和Servlet,这里没有数据库,都是一些假数据。
首先同步全部加载,因为要在js里面去后台获取节点数据,所有我用了ajax,但是是同步的不是异步的,json数据的格式[{id:’1’,pid:’0’,name:’1’},…………]。主页面index.jsp. 我只说js代码,剩下的我相信大家能领会的看代码
1 var zTreeObj;
2 var zNodes;
3 var setting = {
4 check: {
5 enable: true,
6 chkStyle:"checkbox"
7 },
8 data: {
9 simpleData: {
10 enable: true
11 }
12 }
13 };
这是设置树的属性值,在上一篇文章已经结束,在这不多废话了,代码中zTreeObj是定义的一个树的全局变量。zNodes是保存树节点的json对象。继续看
1 $(document).ready(function(){
2 $.ajax({
3 type: "Get",
4 url: 'GetTree',
5 dataType: "text",
6 global: false,
7 async: false,
8 success: function (strReult) {
9 zNodes=eval(strReult);
10 },
11 error: function () {
12 alert("Ajax请求数据失败!");
13 }
14 });
15 zTreeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes);
16 $("#submit").bind('click',getNodeValue);
17 });
上面不难看出我是用ajax同步的方法去后台获取数据的,其中 9行是把获取的数据转换成json对象在赋值给zNodes, 此时zNodes已经有数据了,第15 行是初始化树,传进三个参数,分别是 html对象,setting树属性,zNodes json数据。这行执行完树就在id为treeDemo的地方显示出来了。
其实树就是拿来用的吗,那么当被选中的节点如何才能传到后台给java程序用呢,我的办法是这样的看代码。
第16行按钮绑定一个click
1 function getNodeValue (){
2 var nodes = zTreeObj.getCheckedNodes();
3 var s = '';//选中节点ids
4 //遍历选中的节点,为s赋值
5 for(var i=0; i<nodes.length; i++){
6 var isParent = nodes[i].isParent;
7 if(isParent!=true){
8 if (s != '')s += ',';
9 s += nodes[i].id;
10 }
11 }
12 $("#content").val(s);
13 }
但你选中复选框是按下按钮,通过这个方法就可以获取到叶子节点的信息,id pid name 等信息。把想获取的信息放到id为content的容器里,在用from传到后台,这样就后台就可以用到前台传来的信息了。
树全部加载节点就介绍到这,下面我们来介绍怎样异步加载节点,看代码
1 var zTreeObj;
2 var setting = {
3 check: {
4 enable: true,
5 chkStyle:"checkbox"
6 },
7 async: {
8 enable: true,
9 url:"ShowTree",
10 autoParam:["id", "name=n"],
11 otherParam:{"otherParam":"zTreeAsyncTest"},
12 dataFilter: filter
13 }
14 };
15
16 function filter(treeId, parentNode, childNodes) {
17 if (!childNodes) return null;
18 for (var i=0, l=childNodes.length; i<l; i++) {
19 childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
20 }
21 return childNodes;
22 }
23 function setContentValue(){
24 var nodes = zTreeObj.getCheckedNodes();
25 var s = '';//选中节点ids
26 //遍历选中的节点,为s赋值
27 for(var i=0; i<nodes.length; i++){
28 var isParent = nodes[i].isParent;
29
30 if (s != '')s += ',';
31 s += nodes[i].id;
32
33 }
34 $("#content").val(s);
35 }
36
37 $(document).ready(function(){
38 zTreeObj = $.fn.zTree.init($("#treeDemo"), setting);
39 });
上面的代码作用就是当你点击某一父节点是他会从后台获取其子节点并加载到树里,这就是异步加载树节点的代码,同步加载数据看懂了,这个异步加载树节点自然就通了,我就不再多废话了。
下面是异步分批获取节点用到的java Servlet的dopost方法看代码
1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2 throws ServletException, IOException {
3 String pId = "0";
4 String pName = "";
5 if(null!=request.getParameter("id"))
6 pId = request.getParameter("id");
7 if(null!=request.getParameter("n"))
8 pName =request.getParameter("n");
9 if (pId==null || pId=="") pId = "0";
10 if (pName==null) pName = "";
11 StringBuffer ss = new StringBuffer("[");
12 for (int i=1; i<5; i++) {
13 String nId = pId+i;
14 String nName = pName+"n"+i;
15 ss.append("{ id:'"+nId+"', name:'"+nName+"', isParent:true}");
16 if (i<4) {
17 ss.append(",");
18 }
19 }
20 ss.append("]");
21 response.getWriter().write(ss.toString());
22 }
从这个类里面可以看出我需要json的数据结构,其实我这个test写的漏洞很多,我只是想展示一下怎么用这个ztree。至于其他的大家在用的自己可以完善。