zTree树形组件异步加载数据

最近公司项目中要用到树形组件,开始用的layui,后来发现layui的树形组件不支持异步加载,在网上查发现实现起来很复杂。而公司项目中也有ztree的css,js,于是就选择了ztree。

先来个普通的,总结分4步(引入js,css就不说了)

1,在body里给个实体

<ui id="tree" class="ztree"></ui>

2,配置setting(setting是什么先不管,反正一定要配)

        var setting = {
            check: {
                    enable: true
                   },   
    };
    

3,准备父节点的数据

//isParent 为true 代表这个为父节点,可以把这个去掉或者改为false看看效果
var zNodes=[
		{"name":"长沙","id":1,isParent:true},
		{"name":"常德","id":2,isParent:true},
		{"name":"株洲","id":3,isParent:true}
];

4,实例化  

 

 
//在整个页面执行完后  实例化
  $(function(){
          //三个值,第一步的id   第二步的setting ,第三步的zNodes,注意不要写错了
	   $.fn.zTree.init($("#tree"),setting,zNodes)
   })
    

 

5,整个代码

<!DOCTYPE html>
<HTML>
<HEAD>
	<TITLE> ZTREE DEMO - reAsyncChildNodes</TITLE>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<link rel="stylesheet" href="css/zTreeStyle/zTreeStyle.css" type="text/css">
<!--看这里 引入下面这个后就不是默认的皮肤了--> <link rel="stylesheet" href="css/metroStyle/metroStyle.css" type="text/css"> <script type="text/javascript" src="js/jquery-1.4.4.min.js"></script> <script type="text/javascript" src="js/jquery.ztree.core.js"></script> <!-- <script type="text/javascript" src="../../../js/jquery.ztree.excheck.js"></script> <script type="text/javascript" src="../../../js/jquery.ztree.exedit.js"></script>--> <SCRIPT type="text/javascript"> var setting = { check: { enable: true }, }; $(function(){ $.fn.zTree.init($("#demo"),setting,zNodes) }) var zNodes=[ {"name":"长沙","id":1,isParent:true}, {"name":"常德","id":2,isParent:true}, {"name":"株洲","id":3,isParent:true} ]; </SCRIPT> </HEAD> <BODY> <ui id="demo" class="ztree"></ui> </BODY> </HTML>

6,效果

没有加<link rel="stylesheet" href="css/metroStyle/metroStyle.css" type="text/css">是这个效果 这个样式是ztree给的

加了是这个效果
 

重点来了 异步加载  在普通的基础上加了 2个回调函数

1,准备父节点的数据,先要给一级的父节点一个初始值(这里就是前面的3 4 步)

$.ajax({
			url : 你的url,
			type : "post",
			data : {你的参数},
			dataType : "json",
			success : function(data){
				 
				for(var i=0;i<data.data.length;i++){
		//因为后台没有带 isParent这个参数,而一级节点肯定是父节点就加了给参数
					data.data[i].isParent=true;
					
				};
				
                               //这里直接传参实列化
				$.fn.zTree.init($("#tree"), setting, data.data);	
			
			},error:function(err) {
			}
		});

2,配置setting

var setting = {
			   //异步加载需要做的设置
			   async:{
                   enable:true,
                   //异步请求服务器地址
                   url: ,
                    //向服务器传参
                  //这里有个坑 我找了好久 首先这个id是父节点有的,例如 父节点id:1
                //如果服务器接数据 数url?id=?  的话就直接 
                 //autoParam:["id"],
                 //而如果接据是 url?parentNum=? 
              //其实这个parentNum的值就是父节点id的值就用下面这种方式
                   autoParam:["id=parentNum"],
                //下这个回调函数一定要加,相当于 ajax的 success{}方法 
               //从这个回调得带服务器返回的数据
                   dataFilter: ajaxDataFilter
			   },
			   check: {
                    //true / false 分别表示 显示 / 不显示 复选框或单选框
				 enable: true,   
				 autoCheckTrigger: true,  
			  //勾选框类型(checkbox 或 radio)checkbox:为复选   radio单选	 
                              //单选为什么要用复选了 
                                chkStyle: "radio", 
				 chkboxType : { "Y": "ps", "N": "ps" }
				    },
		       //回调函数,取选中的值
			    callback:{    
                                 //选中或取消选中触发的事件
			    	  onCheck:zTreeOnClick   
		           }
            };

3,相当于ajax的回调函数  dataFilter: ajaxDataFilter

  //zTree异步加载回调函数
	   function ajaxDataFilter(treeId, parentNode, responseData) {
                  //可以打印这几个数据就明白了
                   //如果返回的数据有值
		   if (responseData.data) {
		      for(var i =0; i < responseData.data.length; i++) {
		    	  //不等于三 代表是父类  一样拼接isParent  
                       // 这里做了个校验,因为公司数据就三个节点  所以只让前面2个为父节点
		    	  if(parentNode.level!=1){responseData.data[i].isParent = true;
		        		  }
		      }
		    }
                   //这个return 的数据  就是直接注入到异步加载时 子节点的数据
		    return responseData.data;
		};

4,事件回调取值 点击事件触发的函数,不会知道是什么数据   打印就完事了

         function zTreeOnClick(event, treeId, treeNode) {       //第二步
                  console.log(treeNode);
	    	 var treeObj = $.fn.zTree.getZTreeObj("tree"),
	                nodes = treeObj.getCheckedNodes(true),
	                v = "";
	            for (var i = 0; i < nodes.length; i++) {

	          
	                console.log("节点id:" + nodes[i].id + "节点名称" + v); //获取选中节点的值
	            }
	        }

5,完整代码  

 

<!DOCTYPE html>
<HTML>
<HEAD>
	<TITLE> ZTREE DEMO - reAsyncChildNodes</TITLE>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<link rel="stylesheet" href="css/zTreeStyle/zTreeStyle.css" type="text/css">
	<link rel="stylesheet" href="css/metroStyle/metroStyle.css" type="text/css">
	<script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
	<script type="text/javascript" src="js/jquery.ztree.core.js"></script>
	<!--  <script type="text/javascript" src="../../../js/jquery.ztree.excheck.js"></script>
	  <script type="text/javascript" src="../../../js/jquery.ztree.exedit.js"></script>-->
	  <script >
	  $(function(){
		var setting = {
			   //异步加载需要做的设置
			   async:{
                   enable:true,
                   //异步请求服务器地址
                   url: ,
                    //向服务器传参
                  //这里有个坑 我找了好久 首先这个id是父节点有的,例如 父节点id:1
                //如果服务器接数据 数url?id=?  的话就直接 
                 //autoParam:["id"],
                 //而如果接据是 url?parentNum=? 
              //其实这个parentNum的值就是父节点id的值就用下面这种方式
                   autoParam:["id=parentNum"],
                //下这个回调函数一定要加,相当于 ajax的 success{}方法 
               //从这个回调得带服务器返回的数据
                   dataFilter: ajaxDataFilter
			   },
			   check: {
                    //true / false 分别表示 显示 / 不显示 复选框或单选框
				 enable: true,   
				 autoCheckTrigger: true,  
			  //勾选框类型(checkbox 或 radio)checkbox:为复选   radio单选	 
                              //单选为什么要用复选了 
                                chkStyle: "radio", 
				 chkboxType : { "Y": "ps", "N": "ps" }
				    },
		       //回调函数,取选中的值
			    callback:{    
                                 //选中或取消选中触发的事件
			    	  onCheck:zTreeOnClick   
		           }
            };
		//zTree异步加载回调函数
		function ajaxDataFilter(treeId, parentNode, responseData) {
			if (responseData.data) {
			   for(var i =0; i < responseData.data.length; i++) {
				   //不等于三 代表是父类 
				   if(parentNode.level!=1){responseData.data[i].isParent = true;
						   }
			   }
			 }
			 return responseData.data;
		 };
		 
		  function zTreeOnClick(event, treeId, treeNode) {       //第二步
				console.log(treeNode);
			  var treeObj = $.fn.zTree.getZTreeObj("tree"),
					 nodes = treeObj.getCheckedNodes(true),
					 v = "";
				 for (var i = 0; i < nodes.length; i++) {
 
					 $("#hiddeInput").val(nodes[i].name);
			  //       console.log("节点id:" + nodes[i].id + "节点名称" + v); //获取选中节点的值
				 }
			 }
 
 
		  window.getChoseId=function () {
			 return     $("#hiddeInput").val();
		  }
		  
		 
	 $.ajax({
			 url : 你的url,
			 type : "post",
			 data : {你的参数},
			 dataType : "json",
			 success : function(data){
				  
				 for(var i=0;i<data.data.length;i++){
					 
					 data.data[i].isParent=true;
					 
				 };
				 
				 $.fn.zTree.init($("#tree"), setting, data.data);	
			 
			 },error:function(err) {
			 }
		 });
 
	 
 })
 
	 
 
 </script>

</HEAD>

<BODY>
<input id="hiddeInput" type="hidden" value=""/>
<ui id="tree" class="ztree"></ui>
</BODY>
</HTML>

 最后 API  地址: http://www.treejs.cn/v3/main.php#_zTreeInfo

posted @ 2020-09-17 23:21  KwFruit  阅读(911)  评论(0编辑  收藏  举报