jsTree è ottimo ma la sua documentazione è piuttosto densa. Alla fine ho capito e quindi ecco la soluzione per chiunque si imbattesse in questo thread.
In primo luogo, è necessario associare l'evento open_node all'albero in questione. Qualcosa sulla falsariga di
$("tree").jstree({"themes":objTheme,"plugins":arrPlugins,"core":objCore}).
bind("open_node.jstree",function(event,data){closeOld(data)});
Ad esempio, si configura l'istanza di treeview e quindi si associa l'evento open_node. Qui sto chiamando la funzione closeOld per fare il lavoro che richiedo: chiudo qualsiasi altro nodo che potrebbe essere aperto. La funzione va come così
function closeOld(data)
{
var nn = data.rslt.obj;
var thisLvl = nn;
var levels = new Array();
var iex = 0;
while (-1 != thisLvl)
{
levels.push(thisLvl);
thisLvl = data.inst._get_parent(thisLvl);
iex++;
}
if (0 < ignoreExp)
{
ignoreExp--;
return;
}
$("#divElements").jstree("close_all");
ignoreExp = iex;
var len = levels.length - 1;
for (var i=len;i >=0;i--) $('#divElements').jstree('open_node',levels[i]);
}
Ciò gestire correttamente la piegatura di tutti gli altri nodi indipendentemente dal livello di annidamento del nodo che è stato appena ampliato.
Una breve spiegazione delle fasi coinvolte
- Prima facciamo un passo indietro la vista ad albero fino a raggiungere un nodo di livello superiore (-1 in jstree parlare) assicurandosi che registriamo ogni nodo antenato incontrate nel processo di nell'array livelli
- Successivamente abbiamo comprimere tutti i nodi del treeview
- ora andiamo a ri-expand tutti i nodees nelle livelli matrice. Mentre così facendo non vogliamo che questo codice venga eseguito di nuovo. Per impedire che accada abbiamo impostato il globale ignoreEx variabile al numero di nodi in livelli
- Infine, ci passo attraverso i nodi in livelli ed espandere ciascuno di essi