ztree的简单使用及常见问题解决 递归所有节点

    一个setting一个$.fn.zTree.init(treeId,setting,data);即可创建一个简单的树,点击打开链接大家可以查看ztree的API

首先在JSP页面引入树的js和CSS,因为ztree依赖jQuery,所以先引入jQuery,

[html]  view plain  copy
  1. <script src="目录/jquery-1.8.3/jquery.min.js">script>  
  2. <link rel="stylesheet" type="text/css" href="目录/zTree_v3-3.5.22/css/zTreeStyle/zTreeStyle.css"/>  
  3. <script type="text/javascript" src="目录/zTree_v3-3.5.22/js/jquery-1.4.4.min.js">script>  
  4. <script type="text/javascript" src="目录/zTree_v3-3.5.22/js/jquery.ztree.core.js">script>   

这里要说的 请求数据的方式有两种(水平有限),一种是通过ztree封装的ajax去请求数据,一种是直接用ajax去请求数据,为了记录下防止以后自己查看,这里把两种方式都粘贴出来。

首先是第一种,直接通过ztree去获取数据

[html]  view plain  copy
  1. var setting = {  
  2.         async :{  
  3.             enable :true,  
  4.             type : "post",  
  5.             url :"请求地址",  
  6.             autoParam :["id","pId"], //这里可以自定义后台接受参数的名如:autoParam :["id=myId","pId"] 后台就可以使用myId接收参数了  
  7.             otherParam :{"id":"1", "name":"test"} //这里可以自定义参数值传入后台,可选  
  8.         },  
  9.         callback :{  //这里可以处理请求返回来以后的一些事件  
  10.             onAsyncError : asyncError,  
  11.             onAsyncSuccess : asyncSuccess,  
  12.             onClick : companyTreeClick  
  13.             onExpand : zTreeOnExpand  
  14.         },  
  15.         data :{  
  16.             simpleData :{  
  17.                 enable : true,  
  18.             }  
  19.         },  
  20.         view :{  
  21.             showLine : true  
  22.         }  
  23. };  

ztree的配置有很多,可以满足你的业务需求,这里简单列一下,具体可以去查ztree API地址

第二种请求方式直接使用ajax请求即可(这里是监控一个下拉框的值,通过这个值去获取tree)

[html]  view plain  copy
  1. $("#id").change(function(){  
  2.         var id = $("#id").val();  
  3.         $.ajax({  
  4.             type :"post",  
  5.             dataType : "json",  
  6.             url :"url",  
  7.             data :{"id" : id},  
  8.             success : function (data){  
  9.                 initTree("展示树ul标签id",data);  
  10.             console.log(data);  
  11.         }  
  12.         })  
[html]  view plain  copy
  1. function initTree (id,data){  
  2. var setting = {  
  3.         callback :{  
  4.             onAsyncError : asyncError,  
  5.             onAsyncSuccess : asyncSuccess,  
  6.             onClick : companyTreeClick  
  7.             //onExpand : zTreeOnExpand  
  8.         },  
  9.         data :{  
  10.             simpleData :{  
  11.                 enable : true,  
  12.             }  
  13.         },  
  14.         view :{  
  15.             showLine : true  
  16.         }  
  17. };  
  18. $j.fn.zTree.init($(id),setting,data);  
  19. }  

这里要好好说一下了,因为ztree包也会引用一个jQuery,此处引用的是1.4.4.min.js,页面肯定会报错($.fn.zTree.init($(id),setting,data)识别错误),如果没有可以不用关注这里,可能是jQuery冲突了,解决办法:

[html]  view plain  copy
  1. var $j = jQuery.noConflict();   
  2. $j.fn.zTree.init($(id),setting,data)  

即可(俺是这么解决好的,不保证所有)

 下面的 enable表示:是否使用简单的数据模式(Array)

[html]  view plain  copy
  1. var setting = {  
  2.     data: {  
  3.         simpleData: {  
  4.             enable: true,  
  5.             idKey: "id",  
  6.             pIdKey: "pId",  
  7.             rootPId: 0  
  8.         }  
  9.     }  
  10. };  
  11. var treeNodes = [  
  12.     {"id":1, "pId":0, "name":"test1"},  
  13.     {"id":11, "pId":1, "name":"test11"},  
  14.     {"id":12, "pId":1, "name":"test12"},  
  15.     {"id":111, "pId":11, "name":"test111"}  
  16. ];  
 上面通过ajax返回的data就是Array数据模式
[html]  view plain  copy
  1. {"id":111, "pId":11, "name":"test111","isOpen":true/false}  

接下里就是如何实现递归父子级的树(把要展示的树写成如上格式)

[html]  view plain  copy
  1. List <Department> setDepartment = new ArrayList<Department>();  
  2.    @Override  
  3.    public List<DepartmentTreeDto> findPrimaryDepartmentList(Integer id) {  
  4.        setDepartment.clear();  
  5.        List<DepartmentTreeDto> departmentTreeDtoList = new ArrayList<DepartmentTreeDto>();  
[html]  view plain  copy
  1. //查询所有下级部门  
  2.         List<Department> childDep = departmentDao.findDepartmentList(id);  
  3.         Department department = departmentDao.findPrimaryDepartmentById(id); //根部门  
  4.         DepartmentTreeDto departmentTreeDto = new DepartmentTreeDto(department.getId(),department.getName());//封装成要返回的数据模型  
  5.         departmentTreeDto.setIsParent(true);//表示有子部门,可以展开  
  6.         departmentTreeDtoList.add(departmentTreeDto);  
  7.         List<Department> digui = digui(childDep);  
[html]  view plain  copy
  1. //处理递归所有数据的父子关系和是否有下级部门  
  2.         for (Department department2 : digui) {  
  3.             DepartmentTreeDto departmentTreeDto2 = new DepartmentTreeDto(department2.getId(),department2.getName());  
  4.            if(department2.getChildDep() != null && department2.getChildDep().size()>0){//有子部门时  
  5.                departmentTreeDto2.setIsParent(true);  
  6.                departmentTreeDto2.setpId(department2.getParentDep().getId());  
  7.                departmentTreeDtoList.add(departmentTreeDto2);  
  8.            }else{ //无子部门时  
  9.                departmentTreeDto2.setIsParent(false);  
  10.                departmentTreeDto2.setpId(department2.getParentDep().getId());  
  11.                departmentTreeDtoList.add(departmentTreeDto2);  
  12.            }  
  13.                  
  14.         }  
  15.         return departmentTreeDtoList;  
  16.     }  

[html]  view plain  copy
  1. //递归  
  2.     public List<Department> digui(List<Department> depList){  
  3.         if(depList.size()>0){  
  4.             for (Department dep : depList) {  
  5.                 List<Department> childDep = departmentDao.findDepartmentList(dep.getId());  
  6.                 if(childDep.size()>0){  
  7.                     setDepartment.add(dep);  
  8.                     digui(childDep);  
  9.                 } else {  
  10.                     setDepartment.add(dep);  
  11.                 }  
  12.                   
  13.             }  
  14.         }  
  15.         return setDepartment;  
  16.     }  

你可能感兴趣的:(ztree的简单使用及常见问题解决 递归所有节点)