Telerik Radtreeview y expandir/colapso del lado del cliente
-
26-10-2019 - |
Pregunta
Estoy siguiendo este enfoque para expandir y colapsar todos los nodos en el cliente JavaScript: http://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html
Sin embargo, está tardando mucho en procesar esto, y después de expandirse y luego colapsar, obtengo el error de "script que no responde", por lo que me preguntaba si había una manera de acelerar esto para un árbol bastante grande. ¿Hay una mejor manera de analizarlo? Actualmente, el árbol tiene 4 niveles de profundidad.
Gracias.
Solución
Presenté los errores de "guión que no respondía" al expandir y colapsar el árbol asincrónicamente. Además, me expanio desde la parte inferior (para que pueda ver que los nodos se expanden) y colapsar desde la parte superior, pero solo cuando llega al último nodo en cada rama, por lo que es mucho más interesante para el usuario. Realmente pueden ver que suceda, y si no es rápido (es decir, IE7 y antes es particularmente lento), es al menos entretenido mientras esperan.
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;
};
Otros consejos
Empiece a obtener sus nodos con yourtreeViewInstance.get_nodes()
, y luego el niño nota como eachChildNode.get_nodes()
y así sucesivamente por la jerarquía.
Entonces puede expandir cada elemento llamando .set_expanded(true);
En cada nodo desea expandirse.