zTree异步获取,默认展开一级节点
zTree官网
涉及到zTree的异步获取
这里主要是在setting部分的设置:
setting: {
...,
async: {enable: true, url: getUrl },
callback: { //回调函数,实现展开功能
beforeAsync: beforeAsync,
onAsyncSuccess: onAsyncSuccess,
onAsyncError: onAsyncError
}
}
// 获取树对象,这里参数是树组件objId
$.fn.zTree.getZTreeObj('recorders')
// 展开节点
zTree.expandNode(nodes[i], true, false, false);
// 刷新树
zTree.refresh();
参考文章的封装代码
文章链接: https://www.dandelioncloud.cn/article/details/1537353471057838082
点击查看原文章代码
<input type="button" value="为该角色添加功能" οnclick="addFunction()">
<ul id="areaTree4" class="ztree"></ul>
</div>
<script type="text/javascript">
var setting2 = {
check: {enable: true},
async: {enable: true, url: getUrl },
data: {//数据
key: { name: "functionName" },
simpleData: {
enable: true,
idKey: "functionId", //id
pIdKey: "pid" //pid
}
},
callback: { //回调函数,实现展开功能
beforeAsync: beforeAsync,
onAsyncSuccess: onAsyncSuccess,
onAsyncError: onAsyncError
}
}
var curStatus = "init", curAsyncCount = 0, asyncForAll = false, goAsync = false;
// 默认注入两个参数,第一个是当前树的名字,第二个是选中的节点
function getUrl(treeId, treeNode){
return "/roleProject/FunctionServlet?dir=getFunctionTree&functionId="+treeNode.functionId+"&roleNo="+key;
}
function filter(treeId, parentNode, childNodes) {
if (!childNodes) return null;
for (var i=0, l=childNodes.length; i<l; i++) {
childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
}
return childNodes;
}
// 异步获取前
function beforeAsync() {
curAsyncCount++;
}
// 异步获取成功
function onAsyncSuccess(event, treeId, treeNode, msg) {
curAsyncCount--;
if (curStatus == "expand") {
expandNodes(treeNode.children);
} else if (curStatus == "async") {
asyncNodes(treeNode.children);
}
if (curAsyncCount <= 0) {
if (curStatus != "init" && curStatus != "") {
asyncForAll = true;
}
curStatus = "";
}
}
// 异步获取错误
function onAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) {
curAsyncCount--;
if (curAsyncCount <= 0) {
curStatus = "";
if (treeNode!=null) asyncForAll = true;
}
}
// 自定义展开全部节点的方法
function expandAll() {
var zTree = $.fn.zTree.getZTreeObj("areaTree4");
if (asyncForAll) {
zTree.expandAll(true);
} else {
expandNodes(zTree.getNodes());
if (!goAsync) {
curStatus = "";
}
}
}
// 自定义展开部分节点
function expandNodes(nodes) {
if (!nodes) return;
curStatus = "expand";
var zTree = $.fn.zTree.getZTreeObj("areaTree4");
for (var i=0, l=nodes.length; i<l; i++) {
zTree.expandNode(nodes[i], true, false, false);
if (nodes[i].isParent && nodes[i].zAsync) {
expandNodes(nodes[i].children);
} else {
goAsync = true;
}
}
}
// 使用
var zNodes2=[{functionId:0, functionName:"功能", pid:-1, isParent:true, checked:true }];
$(document).ready(function(){
$.fn.zTree.init($("#areaTree4"), setting2, zNodes2);
expandAll(); //调用写好的展开全部节点方法
});
</script>
修改后
因为我的需求是展开至第二级,而且组件的使用代码不同,对于上面的代码进行了改造
组件配置代码
var testTree = {
lazy: true,
zTree: '',
pNode: '',
jqueryObj: null,
objId: '',
setting: {
check: { enable: true },
isSimpleData: true,
treeNodeKey: 'id',
treeNodeParentKey: 'pid',
showLine: true,
async: {
//异步
enable: true,
url: getUrl,
},
root: {
isRoot: true,
nodes: [],
},
showLine: true,
view: {
dblClickExpand: false,
showLine: false,
selectedMulti: false,
},
callback: {
// 展开节点触发
onExpand: function (event, treeId, treeNode) {
testTree.pNode = treeNode
testTree.loadNodeByPNode()
},
// 勾选复选框触发
onCheck: function (event, treeId, treeNode) {
testTree.pNode = treeNode
testTree.zTreeOnCheck(treeNode)
let { checked, id, pid } = treeNode
console.log(checked, id, pid)
$.ajax({
url: $('[name=context]').val() + '/4g/openapi/railway/device/find', //后台数据请求地址
type: 'get',
dataType: 'json',
data: {
id: id,
pid: pid,
},
async: false,
success: function (result) {
console.log(result)
},
})
},
// 回调函数,实现展开功能
// 异步获取并展开至第二级,
beforeAsync: beforeAsync,
onAsyncSuccess: onAsyncSuccess,
onAsyncError: onAsyncError,
},
},
//加载根节点,pid=null, treeElement=dev
loadRootNode: function (jqueryObj, objId) {
testTree.objId = objId
testTree.jqueryObj = jqueryObj
var context = $('[name=context]').val()
var zNodes = []
var parameter = null
$.get(context + '/4g/openapi/railway/organizaton/find', parameter, function (data) {
$.each(data, function (i, item) {
var html = {
id: item.id,
pid: item.pid,
name: item.name,
open: false,
noR: false,
isParent: true,
parent: true,
}
zNodes[i] = html
})
$.fn.zTree.init(testTree.jqueryObj, testTree.setting, zNodes)
testTree.zTree = $.fn.zTree.getZTreeObj(testTree.objId)
// 默认列出二级节点,这里展开一级节点但是没有触发获取二级节点
let treeObj = $.fn.zTree.getZTreeObj('recorders')
let nodes = treeObj.getNodesByParam('level', 0)
for (var i = 0; i < nodes.length; i++) {
// 异步加载Tree 想要默认展开全部节点,使用普通的方法是不行的。
// 设置节点展开
// treeObj.expandNode(nodes[i], true, false, true)
// expandAll();
expandNodes(nodes)
}
})
},
// 加载子节点
loadNodeByPNode: function () {
var context = $('[name=context]').val()
var children = []
var folder = false
var parameter = null
var url =
context + '/4g/openapi/railway/organizaton/find?id=' + testTree.pNode.id + '&pid=' + testTree.pNode.pid
//获取pid = mid的数据,也就是子节点的id等于父节点的id,说明此父节点加载了子节点
if (!testTree.zTree.getNodeByParam('pid', testTree.pNode.id)) {
$.get(url, parameter, function (data) {
$.each(data, function (o, item2) {
var html2 = {
id: item2.id,
pid: item2.pid,
name: item2.name,
open: false,
isParent: true,
}
folder = false //item2.checked;
children[o] = html2
})
testTree.zTree.addNodes(testTree.pNode, children, folder)
})
}
},
// 勾选节点复选框触发
zTreeOnCheck: function (treeNode) {
// console.log(treeNode)
if (treeNode.checked == true) {
} else {
}
},
// 选择节点触发
selectNodes: function () {
var selectIds = ''
var treeObj = $.fn.zTree.getZTreeObj(testTree.objId)
return treeObj.getCheckedNodes(true)
},
}
改造后的代码
var curStatus = 'init',
curAsyncCount = 0,
asyncForAll = false,
goAsync = false
function beforeAsync() {
curAsyncCount++
}
function onAsyncSuccess(event, treeId, treeNode, msg) {
curAsyncCount--
// 这里需要配置子节点的isParent属性,不然默认为叶子节点
treeNode.children = treeNode.children.map((row) => {
row.isParent = true
return row
})
// 这里我尝试去掉,不展开子节点,但是去掉之后会影响我的子节点展示为可展开节点
if (curStatus == 'expand') {
expandNodes(treeNode.children)
} else if (curStatus == 'async') {
asyncNodes(treeNode.children)
}
// 取消状态,不再往下展开,
curStatus = ''
// 因为expandNodes也没再往下获取,上面展开子节点会导致展开图标是展开了但是底下无数据
// 遍历然后设置子节点不展开
treeNode.children = treeNode.children.map((row) => {
row.open = false
return row
})
var zTree = $.fn.zTree.getZTreeObj('recorders')
// 刷新树重置子节点的展开状态
zTree.refresh();
}
function onAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) {
curAsyncCount--
if (curAsyncCount <= 0) {
curStatus = ''
if (treeNode != null) asyncForAll = true
}
}
function expandAll() {
var zTree = $.fn.zTree.getZTreeObj('recorders')
if (asyncForAll) {
zTree.expandAll(true)
} else {
expandNodes(zTree.getNodes())
if (!goAsync) {
curStatus = ''
}
}
}
function expandNodes(nodes) {
if (!nodes) return
curStatus = 'expand'
var zTree = $.fn.zTree.getZTreeObj('recorders')
for (var i = 0, l = nodes.length; i < l; i++) {
//打开节点 ,第一个参数表示哪个节点,第二个参数表示展开还是关闭,第三个参数表示 是否打开全部子孙节点
zTree.expandNode(nodes[i], true, false, false)
if (nodes[i].isParent && nodes[i].zAsync) {
// 因为我这里只需要展开一级节点,所以这里不继续打开底下子节点
// expandNodes(nodes[i].children)
} else {
goAsync = true
}
}
}
// 这里改成自己获取子节点的接口
function getUrl(treeId, treeNode) {
//默认注入两个参数,第一个是当前树的名字,第二个是选中的节点
var context = $('[name=context]').val()
var url = context + '/4g/openapi/railway/organizaton/find?id=' + treeNode.id + '&pid=' + treeNode.pid
return url
}
zTree异步获取,默认展开一级节点的更多相关文章
- ztree 展开一级节点 | ztree只显示到二级目录
// 默认展开一级节点var nodes = tree.getNodesByParam("level", 0);for (var i = 0; i < nodes.lengt ...
- 如何获取json某一级节点的数据
如何获取json某一级节点的数据 最近做项目有获取和设置固定格式某一级节点值的需求.但是要一级一级地取对于多级的结构来说代码过于冗余且重复,于是写了个递归的方法根据json路径完成值的定点操作.废话不 ...
- zTree异步加载展开第一级节点
在 setting 中的 callback 中加上 onAsyncSuccess:onAsyncSuccess 回调函数 , 然后实现回调函数 var isFirst = true;function ...
- FLEX中Tree默认展开全部节点
这里分两种情况,一种是数据源在MXML文件里,如: <mx:XML id="treeXML" format="e4x"> <root> ...
- zTree异步加载并初始化树时全部展开(贴主要代码)
<%@page pageEncoding="UTF-8"%> <%@include file="/commons/include/html_doctyp ...
- zTree异步生成数据时无法获取到子节点的选中状态
最近在项目中遇到一个问题,需求如下: 根据选中不同的人员(ID)向后台发送ajax请求,通过返回的数据来生成该人员的权限访问树,该树目录最少为3级目录,在生成的时候会自动勾选上次保存过的选中状态,点击 ...
- Ztree异步加载自动展开节点
在Ztree的官网Demo中,有自动展开的例子,是通过设置节点属性open:true来实现自动展开的,但是在异步加载中,这个属性设置为true也不会自动展开,因为open:true是指在有子节点的情况 ...
- zTree实现获取一级节点数据
zTree实现获取一级节点数据 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</t ...
- vue使用树形控件z-tree,动态添加数据,默认展开第一行
环境:vue 2.9.3; webpack; 插件:z-tree,jquery(cnpm install xxxx) 问题;由于数据量比较多,需要动态加载数据,默认第一次请求的数据是最高一级,然后子集 ...
- angular ztree 梯形结构json配置、点击节点事件、默认展开所有
// 获取树数据 $scope.initZtreeData = function () { var url = '/bpopstation/func/queryAll.do'; $http.post( ...
随机推荐
- Linux 服务器内存异常问题记录
一.内存异常 1. 问题描述:服务器内存一会儿就增加1G,但也没有看到有消耗内存较大的进程:最后联想到项目最近做ARM架构适配,有变更代码,立马想到使用的SSH组件,一查看就发现有大量的进程: 解决办 ...
- K8S详细教程
Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单, ...
- 激光雷达ldlidar communication is abnormal.
查看串口设置是否正常,可以通过cat /dev/ttyS4查看是否有数据以确定所接的串口是否正确
- data_analysis:初识numpy
import numpy as npimport pandas as pd# """第一种,使用loadtxt"""# # 加载数据路径# ...
- Java基础学习:8、构造器(构造方法)和this
一.构造器: 1.定义:构造器是类的特殊方法,它的主要作用是完成对象的初始化. 即在创建对象时初始化对象. 本质是方法. 2.特点: a.方法名和类名一致. b.无返回值. c. ...
- Visual Studio 安装时,共享组件、工具和SDK的路径无法更改解决方法
Visual Studio 安装时,共享组件.工具和SDK的路径无法更改解决方法 解决方案: 找到电脑中Visual Studio 2019或其他版本的VS 的注册表,删除共享组件.工具和 SDK 的 ...
- Linux 第九章( 网卡配置,双网卡绑定,密钥,管理远程会话 )
/etc/hosts.allow 允许 //默认是先匹配允许在匹配拒绝 /etc/hosts.deny 拒绝 service iptables save //保存iptables配置 ...
- C++和C中的输入输出总结、标准输入/标准输出/标准错误与重定向,>>、>、<、<<
标准输入/标准输出/标准错误与重定向 0表示标准输入.1表示标准输出.2标准错误.1和2都是默认是输出到屏幕. linux中的>>.>.<.<<:这些符号是Linu ...
- MySQL无法同时执行多条语句解决办法 Dbeaver
一.场景 说明:在数据库中同时执行多条语句,提示语法错误,如下图: 二.解决办法 第一步:在每条语句最后加上分号(;)表示本条语句结束: 第二步:在数据库连接串上设置 allowMultiQuerie ...
- Python学习笔记(二)变量的使用
一.变量的定义 把程序运算的中间结果临时存到内存里,以备后面的代码继续调用,这几个名字的学名就叫做"变量" 可以把变量看做保存信息的容器,它们的目的是在内存中标注和存储数据,然后可 ...