Я использую в своем приложении jQuery dynaTree и хочу программно выбрать все дочерние узлы, когда выбран родительский узел. Структура моего дерева выглядит следующим образом
<div id = "tree">
<ul>
<li>package 1
<ul>
<li>module 1.1
<ul>
<li> document 1.1.1</li>
<li> document 1.1.2</li>
</ul>
</li>
<li>module 1.2
<ul>
<li>document 1.2.1</li>
<li>document 1.2.2</li>
</ul>
</li>
</ul>
</li>
<li> package 2
<ul>
<li> module 2.1
<ul>
<li>document 2.1.1</li>
<li>document 2.1.1</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
Теперь я хочу, чтобы при нажатии на узел дерева с заголовком «пакет 1» все его дочерние узлы, т. Е. (Модуль 1.1, документ 1.1.1, документ 1.1.2, модуль 1.2, документ 1.2.1, документ 1.2 .2) также должен быть выбран.
Ниже приведен подход, который я пытался использовать:
$("#tree").dynatree({
onSelect: function(flag, dtnode) {
// This will happen each time a check box is selected/deselected
var selectedNodes = dtnode.tree.getSelectedNodes();
var selectedKeys = $.map(selectedNodes, function(node) {
//alert(node.data.key);
return node.data.key;
});
// Set the hidden input field's value to the selected items
$('#SelectedItems').val(selectedKeys.join(","));
if (flag) {
child = dtnode.childList;
alert(child.length);
for (i = 0; i < child.length; i++) {
var x = child[i].select(true);
alert(i);
}
}
},
checkbox: true,
onActivate: function(dtnode) {
//alert("You activated " + dtnode.data.key);
}
});
В условии if(flag)
я получаю все дочерние узлы элемента, выбранного пользователем, и это дает мне правильное значение, которое я вижу в операторе alert (child.length). Затем я запускаю цикл, чтобы выбрать все дочерние элементы, но цикл никогда не выходит за пределы оператора var x = child[i].select(true);
И я никогда не смогу увидеть выполнение оператора alert(i)
. Результатом вышеприведенного утверждения является то, что если я выбираю пакет 1, модуль 1.1 и документ 1.1.1 также выбираются, но он никогда не выполняет оператор alert(i)
- другие дочерние элементы пакета 1 не выбираются. На мой взгляд, когда выполняется первый оператор child[i].select(true)
, он также запускает событие выбора дочерних элементов, создавая рекурсивную вещь
Правильно ли мое мышление? Независимо от того, какую рекурсию или что она делает, она не завершает цикл и не выполняет следующую инструкцию alert(i)
.
Пожалуйста, помогите мне в решении этой проблемы. Мне не терпится увидеть это предупреждение, любые предложения и помощь очень ценятся.