前言:
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); }