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

浙公网安备 33010602011771号