Domanda

Sto usando dynaTree di jQuery nella mia richiesta e voglio selezionare i tutti i nodi figlio di programmazione quando si seleziona un nodo padre. La struttura del mio albero è la seguente

<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> 

Ora quello che voglio è che quando clicco sul nodo della struttura con il titolo "pacchetto 1" tutti i nodi cioè (modulo 1.1, 1.1.1 del documento, documento 1.1.2, modulo 1.2, 1.2.1 del documento, documento il suo bambino 1.2 .2) dovrebbe essere selezionato anche.

Di seguito è l'approccio che ho cercato di utilizzo:

$("#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);
        }


    });

Nella condizione if(flag) ricevo tutti i nodi del bambino di elemento selezionato dall'utente e mi dà il valore corretto che posso vedere da alert (child.length) dichiarazione. Poi ho eseguito il loop per selezionare tutti i bambini, ma anello non va mai oltre la dichiarazione var x = child[i].select(true);

E non riesco mai a vedere la alert(i) dichiarazione in esecuzione. Il risultato della dichiarazione di cui sopra è che se seleziono pacchetto 1, viene anche selezionato il modulo 1.1 e 1.1.1 del documento ma non è mai esegue l'istruzione alert(i) - altri figli della confezione 1 sono selezionati. A mio avviso, quando viene eseguita dichiarazione child[i].select(true) prima volta si innesca anche il su Seleziona evento dei suoi figli rendendo così una sorta di cose ricorsione

E 'il mio pensiero è corretto? Non importa quale sia la ricorsione o cosa mai lo fa, non completa il ciclo ed eseguire la stessa istruzione successiva alert(i).

Si prega di aiutarmi a risolvere questo problema. Muoio dalla voglia di vedere che allerta e per qualsiasi suggerimento e aiuto è molto apprezzato.

È stato utile?

Soluzione

Appena testato, ma si potrebbe provare qualcosa di simile:

$(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;
            }
        }

Altri suggerimenti

Pur non essendo un esperto di capacità interne di Dynatree, ho scritto un po 'di codice che genera il pangrattato per il nodo selezionato e tutti i suoi discendenti.

Nell'esempio qui sotto, cliccando su "commestibili" visualizzerà:

edibles
edibles > fruits
edibles > fruits > apples
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
edible > vegetables
edible > vegetables > potatoes

mentre si fa clic su "mele verdi" visualizzerà:

edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith

E 'possibile trarre ispirazione da questo esempio e recuperare i campi desiderati da tutti i documenti per bambini e generare l'output HTML.

Il codice è in questa discussione: Il modo migliore per generare pangrattato di testo da un array PHP avendo 3 colonne (id, percorso, il nome)?

Lo script PHP stesso è chiamato dal gestore di eventi OnActivate di Dynatree attraverso una query jQuery.ajax({...});.

scroll top