Telerik RadTreeView E sul lato client Espandi /
-
26-10-2019 - |
Domanda
Sto seguendo questo approccio per espandere e comprimere tutti i nodi client JavaScript: http://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html
Tuttavia, sta prendendo un sacco di tempo per elaborare questo, e dopo l'espansione poi crollare, ottengo l'errore "di script non risponde", quindi mi chiedevo se ci fosse un modo per accelerare questo per una piuttosto grande albero? C'è un modo migliore per analizzarlo? Attualmente, l'albero è di 4 livelli di profondità.
Grazie.
Soluzione
ho ottenuto intorno agli errori "di script che non rispondono" espandendo e comprimendo l'albero in modo asincrono. Inoltre, espando dal basso (in modo da poter vedere i nodi espandono) e collasso dall'alto, ma solo quando si arriva all'ultimo nodo in ciascun ramo, così visivamente è molto più interessante per l'utente. Si può effettivamente vedere accadere, e se non è veloce (IE7 e prima è particolarmente lenta), è almeno intrattenere mentre aspettano.
var treeView, nodes;
function expandAllNodesAsynchronously() {
if (<%= expandedLoaded.ToString().ToLower() %>) {
treeView = $find("<%= tv.ClientID %>");
nodes = treeView.get_allNodes();
if (nodes.length > 1) {
doTheWork(expandOneNode, nodes.length);
}
return false;
} else
return true;
}
function expandOneNode(whichNode) {
var actualNode = nodes.length - whichNode;
if (nodes[actualNode].get_nextNode() == null) {
nodes[actualNode].get_parent().expand();
}
}
function collapseAllNodesAsynchronously() {
treeView = $find("<%= tv.ClientID %>");
nodes = treeView.get_allNodes();
if (nodes.length > 1) {
doTheWork(collapseOneNode, nodes.length);
}
}
function collapseOneNode(whichNode) {
if (nodes[whichNode].get_nextNode() == null && nodes[whichNode].get_parent() != nodes[0]) {
nodes[whichNode].get_parent().collapse();
}
}
function doTheWork(operation, cycles) { //, callback
var self = this, // in case you need it
cyclesComplete = 1,
batchSize = 10; // Larger batch sizes will be slightly quicker, but visually choppier
var doOneBatch = function() {
var c = 0;
while(cyclesComplete < cycles) {
operation(cyclesComplete);
c++;
if(c >= batchSize) {
// may need to store interim results here
break;
}
cyclesComplete++;
}
if (cyclesComplete < cycles) {
setTimeout(doOneBatch, 1); // "1" is the length of the delay in milliseconds
}
else {
// Not necessary to do anything when done
//callback(); // maybe pass results here
}
};
// kickoff
doOneBatch();
return null;
};
Altri suggerimenti
Avvia fuori ottenere i nodi con yourtreeViewInstance.get_nodes()
, e poi i nodi figlio come eachChildNode.get_nodes()
e così via fino alla gerarchia.
Quindi è possibile espandere ogni elemento chiamando .set_expanded(true);
in ogni nodo si desidera espandere.