Как я могу выбрать дочерний узел программно, в dynatree? - PullRequest
4 голосов
/ 13 мая 2010

Я использую в своем приложении 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 ]

2 голосов
/ 16 мая 2010

Едва протестировано, но вы можете попробовать что-то вроде этого:

$(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;
            }
        }
0 голосов
/ 07 января 2019

Используйте следующую функцию вместо ответа mar10 .

Все дочерние узлы выбираются / не выбираются при выборе / отмене выбора родительского узла.

onSelect: function (isSelected, node) {
    node.visit(function (childNode) {
        childNode.select(isSelected);
    });
},
0 голосов
/ 17 февраля 2017

Хотя я и не был экспертом по внутренним возможностям 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({...});.

...