2010-02-16 10 views
9

Я хотел бы знать, как я могу проверить узлы-братья дерева, щелкая по определенному узлу в ExtJs.проверять дочерние узлы дерева при щелчке родителя [ExtJS]

Я дал идентификаторы для каждого узла, и я могу получить доступ к идентификатору щелкнутого узла. то как я могу перейти к проверке дочерних узлов автоматически?

кто-то пожалуйста, помогите мне ..

ответ

7
// or any other way of getting hands on the node you want to work with 
var node = treePanel.getNodeById('your-id'); 
node.eachChild(function(n) { 
    n.getUI().toggleCheck(true); 
}); 

Если вы хотите, чтобы это работало на всем поддереве текущего узла, вы должны сделать некоторые рекурсии.

Чуть более комплексный:

treePanel.on('checkchange', function(node, checked) { 
    node.eachChild(function(n) { 
     n.getUI().toggleCheck(checked); 
    }); 
}); 
+2

не работает в новых версиях API. это удалось http://stackoverflow.com/questions/6579769/automatically-check-uncheck-all-subtree-nodes-in-extjs-tree-when-certain-node-ge – pahan

+0

Это правильно. Код выше для Ext JS 3, Ext JS 4 довольно сильно изменил API дерева. –

+2

Итак, если вы не разберете дочерние узлы, они не будут загружаться. Поэтому, когда вы вызываете checkchange, он будет проверять только загруженные дочерние узлы. То, что я закончил, это добавить node.expand (true); до node.eachChild, поэтому он расширяет все узлы и проверяет их все. – Grammin

0

JSON или XML потребуется «проверено» свойство установлено значение истина или ложь, когда вы заполнения узлов. Я предполагаю, что вы используете AsyncTreeNode, чтобы сделать это за вас. Если узлы дерева создаются без этого проверенного свойства, ExtJS не будет отображать его с помощью флажка.

5
function nodeCheck(node) { 
    node.eachChild(function(n) { 
     if(n.hasChildNodes()) 
      nodeCheck(n) 
     n.getUI().toggleCheck(false); 
    }); 
} 
var node = (tree.getSelectionModel().getSelectedNode()) ? tree.getSelectionModel().getSelectedNode() : tree.root; 
if(node) nodeCheck(node); 

Это хорошо работает для меня;)

+0

Работайте отлично! По крайней мере, в Chrome у меня нет следующей ошибки: «Максимальный размер стека вызовов» =) –

2

слушателей: {

checkchange : function(node, checked) { 
    node.parentNode.cascadeBy(function(n){n.set('checked', checked);}); 
} 

}

1
function checkChange(node, checked, Object) { 
    node.cascadeBy(function(n) { 
     n.set('checked', checked); 
    }); 
} 
+0

Некоторое краткое объяснение было бы полезно. –

-1

Или, если, как я, вы должны автоматически проверить/снимите флажок родительский узел, когда все дочерние листовые узлы отмечены или сняты, вы можете попробовать следующее:

0

Ответ г-на C отлично работает (ExtJS 4.2), но ошибка будет происходить, когда дочерние элементы родительского узла имеют 1 ребенка. Вот мое небольшое улучшение. Кто-то может еще улучшить

function (node, checked) { 

    if (node.isLeaf()) { 
     node = node.parentNode; 
     var siblingStateEqual = true; 
     if (node.childNodes.length == 1) { 
      siblingStateEqual = checked; 
     } else { 
      node.cascadeBy(function (n) { 
       if (n != node) { 
        if (n.get('checked') != checked) { 
         siblingStateEqual = false; 
        } 
       } 

      }); 
     } 

     if (siblingStateEqual == checked) { 
      node.set('checked', checked); 
     } 

    } 
    else { 
     node.cascadeBy(function (n) { 
      n.set('checked', checked); 
     }); 
    } 
}