Как я могу выбрать дочерний узел программно, в dynatree?
Я использую 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)
,
Пожалуйста, помогите мне в решении этой проблемы. Мне не терпится увидеть это предупреждение, любые предложения и помощь очень ценятся.
3 ответа
Едва протестировано, но вы можете попробовать что-то вроде этого:
$(function(){
var inEventHandler = false;
$("#tree").dynatree({
checkbox: true,
selectMode: 2,
[...]
onSelect: function(select, dtnode) {
// Ignore, if this is a recursive call
if(inEventHandler)
return;
// Select all children of currently selected node
try {
inEventHandler = true;
dtnode.visit(function(childNode){
childNode.select(true);
});
} finally {
inEventHandler = false;
}
}
Используйте следующую функцию вместо ответа от 10 марта.
Все дочерние узлы выбираются / не выбираются при выборе / отмене выбора родительского узла.
onSelect: function (isSelected, node) {
node.visit(function (childNode) {
childNode.select(isSelected);
});
},
Несмотря на то, что я не был экспертом по внутренним возможностям Dynatree, я написал некоторый код, который генерирует панировочные сухари для выбранного узла и всех его потомков.
В приведенном ниже примере, нажав на "съедобные", вы получите:
edibles
edibles > fruits
edibles > fruits > apples
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
edible > vegetables
edible > vegetables > potatoes
при нажатии на "зеленые яблоки" будет выведено:
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
Из этого примера вы можете черпать вдохновение, извлекать нужные поля из всех дочерних документов и генерировать вывод HTML.
Код в этой теме: Лучший способ генерировать текстовые хлебные крошки из массива PHP, имеющего 3 столбца (id, path, name)?
Сам скрипт PHP вызывается из обработчика события onActivate Dynatree через jQuery.ajax({...});
запрос.