前言:
Ztree官方给的API可以设置勾选一个节点的同时勾选子节点或者父节点,也可以设置不影响父子节点,即将chkboxType设置为{"Y":"","N":""},而有时我们希望实现这样的功能,点击一个节点判断他所有的父节点和子节点,如果有选中的话就取消勾选,这样的话官方貌似没有给出有效的解决方案,这篇文章记录一下我是怎么解决这个问题的。
需求:
点击一个节点,判断他所有的父节点和子节点,如果有选中的节点,则取消选中。
实现步骤:
首先看下官方给的API
这里给个传送门:点击这里
可以看到其实官方给的是这样的逻辑:
假设有这样一组数据:
江苏、南京、XX区域、XX街道、XX小区
那么在勾选南京的时候其实要么选中所有子节点、要么选中所有父节点。或者不影响父子节点。
而要实现上面的需求肯定是要先设置为不影响父子节点,如下所示效果:
然后循环遍历其父节点和子节点,设置checked属性为false即可;
几点需要注意的:
1.这里子节点是一个递归操作,子节点的子节点也应该被取消选中。
2.treeNode.getPath();可以获取当前节点的所有父节点,包括他自己,所以要把自身排除。
3.每次设置完checked属性为false之后,应该更新一下节点,否则没有直接效果,鼠标滑过才会有效果。
示例代码如下:
function customBeforeCheck(event, treeId, treeNode,treeObj) {
var childNodes = treeNode.children;
for(var i=0;i<childNodes.length;i++) {
recursion(childNodes[i],treeObj);
}
var parenNodes = treeNode.getPath();
for(var i=0;i<parenNodes.length;i++) {
if(parenNodes[i] != null && parenNodes[i].id != treeNode.id) {
parenNodes[i].checked = false;
treeObj.updateNode(parenNodes[i]);
}
}
} function recursion(node,treeObj) {
if(node.children && node.children.length >0) {
node.checked = false;
for(var i=0;i<node.children.length;i++) {
recursion(node.children[i],treeObj);
}
}else{
node.checked = false;
}
treeObj.updateNode(node);
}