Come posso selezionare nodo figlio di programmazione, in dynatree?
-
26-09-2019 - |
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.
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({...});
.
Utilizza la seguente funzione al posto di quello da risposta di Mar10.
Tutti i nodi figlio sono selezionati / deselezionata sul nodo principale selezionare / deselezionare.
onSelect: function (isSelected, node) {
node.visit(function (childNode) {
childNode.select(isSelected);
});
},