JQuery EasyUI之treegrid级联勾选的简单改进版

最近需要搞点权限方面的东西,后台用的是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 }