最近需要搞點權限方面的東西,后台用的是Jquery Easyui treegrid 1.2.6,可惜沒有級聯勾選功能
Tree如下格式
0
----1
--------2
--------3
----4
--------5
--------6
--------7
根節點是0,級別是0,有兩個子節點1,4,級別為1,
子節點1,4各自有多節點分別是2,3和5,6,7,級別為2
需求如下
1.選擇根節點0的時候,必須選擇所有后代節點,1-7全部都要被選擇
2.取消選擇根節點0的時候,必須取消選擇所有后代節點,1-7全部都要被取消選擇
3.當選擇節點1的時候,必須將1的父節點0也選擇,但此時0的其它子節點就不能自動被選擇了,保持原樣
4.取消1節點的時候,同2步,后代節點2,3都取消
5.當選擇2節點的時候,需要選擇1,0兩個節點,
6.取消2的時候,需要看3是否有沒有被選擇,如果有則1選擇,如果3沒選,則1不選,0是否被選需要看1或者4有沒有被選擇
總結一下
1.選擇某節點的時候,必須選擇這個節點下面的所有后代節點,反之,取消選擇后代子節點
2.選擇某節點的時候,必須將此節點的父節點選上,包含所有前代父節點
取消某節點的時候,如果此節點的兄弟節點都沒有被選擇,那么父節點,也取消選擇,
換句話說就是需要看父節點下面的子節點有沒有被選擇的,有那么父節點仍然選擇,如果沒有一個被選擇,那么父節點也取消選擇
-------------找前人的勞動成功
搜索到一篇文章,感謝原作者
treegrid級聯勾選或深度級聯勾選擴展:兩種擴展
里面有兩種方式實現了上述需求的的1,實現2中的一部分,
不過在取消節點時候,父節點是否取消有點問題
我主要是用第二種方式(屬性方式,非函數方式),這里我加上了一個函數 判斷父節點是否需要被取消
1 /** 2 * 級聯判斷父節點 的子節點是否有被選擇的 3 * @param {Object} target 4 * @param {Object} id 節點ID 5 * @return {TypeName} 6 */ 7 function IsParentHasSelectedChildren(target,id,idField,status) 8 { 9 var count=0; 10 var children = target.treegrid('getChildren',id); 11 var selectNodes = $(target).treegrid('getSelections');//獲取當前選中項 12 var p=target.treegrid('find',id); 13 //注意,這里的children是指后代所有子節點,不是指兒子節點,所以要加上children[i]['_parentId']==p[idField]過濾出兒子節點 14 for(var i=0;i<children.length ;i++ ) 15 { 16 var childId = children[i][idField]; 17 for(var j=0;j<selectNodes.length;j++){ 18 if(selectNodes[j][idField]==childId && children[i]['_parentId']==p[idField]) 19 count++; 20 } 21 } 22 //注意,click 函數在unselect事件之前運行,這里需要減去自己 23 return count-1>0; 24 }
主要是增加函數IsParentHasSelectedChildren,父節點下面的兒子節點被選擇的個數是否大於0來判斷是否取消父節點
里面最后count減一,是當前click事件是在onselect事件有關,表示排除自己,這里沒有詳細研究,
在函數selectParent的里面加上第九行調用的
1 function selectParent(target,id,idField,status){ 2 var parent = target.treegrid('getParent',id); 3 if(parent){ 4 var parentId = parent[idField]; 5 if(status) 6 target.treegrid('select',parentId); 7 else 8 { 9 if (!IsParentHasSelectedChildren(target,parentId,idField)) 10 target.treegrid('unselect',parentId); 11 } 12 selectParent(target,parentId,idField,status); 13 } 14 }