选中并取消选中treepanel中的节点

时间:2014-01-24 11:41:41

标签: extjs extjs4.2 treepanel

  

要做:检查孩子应该检查树上的父母,清除父母复选框应该清除所有孩子。

示例:

parent1  
--child1  
--child2  
--subChild1  
--subChild2

  

场景1 :在上述情况下,如果选中 subChild1 ,则还应检查 parent1和child2

     

场景2 :如果选中 parent1 ,则应取消选中其所有子项(已选中)。

从此Check/Uncheck Nodes开始,仅当选择父节点时,才会选择其子节点。

他们是按照我想要的方式实现的,但由于复杂程度足以让我理解,所以无法弄明白(实现)。这就是它reference

请帮我解决此问题。谢谢。感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

这就是我所做的。花了一些时间,但它确实有效。

checkchange : function(node, checked, opts) {

 function clearNodeSelection(node){
  //node is not leaf node
   console.log(node);
   leafNode = node.raw.leaf;
   if(!leafNode){
      node.cascadeBy(function(node) {
            node.set('checked', false);
       })
   }
 }

 if(!checked){
    console.log("inside !checked : "+checked);
    clearNodeSelection(node);
 }

 function selectParentNodes(node){
     var parentNode = node.parentNode;
     if(parentNode){
        parentNode.set('checked', true);
        selectParentNodes(parentNode);
    }
 }

 selectParentNodes(node);
}

Atlast,谢谢@VDP。 “太棒了”。

答案 1 :(得分:3)

你去! Working fiddle

=>你为checkchange添加一个监听器,检查它是否有childNodes,如果这样设置了childNodes的值

  

注意:检查数据是否有checked: false参数以启用复选框。 (如果不是由后端发送,您可以通过将其添加到模型并将其设置为默认值来强制它)

var store = Ext.create('Ext.data.TreeStore', {
    root: {
        expanded: true,
        children: [
            { text: "detention", leaf: true, checked: false },
            { text: "homework", expanded: true, children: [
                { text: "book report", leaf: true, checked: false },
                { text: "algebra", leaf: true, checked: false}
            ], checked: false },
            { text: "buy lottery tickets", leaf: true, checked: false }
        ]
    }
});

Ext.create('Ext.tree.Panel', {
    title: 'Simple Tree',
    width: 200,
    height: 150,
    store: store,
    rootVisible: false,
    renderTo: Ext.getBody(),
    listeners: {
        checkchange: function( node, checked, eOpts ){
            if(node.hasChildNodes()){
                node.eachChild(function(childNode){
                    childNode.set('checked', checked);
                });
            }
        }
    }

});