Telerik Radtreeview und Client-Side-Erweiterung/Zusammenbruch
-
26-10-2019 - |
Frage
Ich verfolge diesen Ansatz, um alle Knoten im Client JavaScript zu erweitern und zusammenzubrechen: http://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html
Es dauert jedoch sehr lange, um dies zu verarbeiten, und nach dem Erweiterung und dem Zusammenbruch bekomme ich das "Skript nicht reagierende" Fehler. Ich habe mich also gefragt, ob es eine Möglichkeit gab, dies für einen ziemlich großen Baum zu beschleunigen? Gibt es einen besseren Weg, um es zu analysieren? Derzeit ist der Baum 4 Ebenen tief.
Vielen Dank.
Lösung
Ich habe das "Skript nicht reagierende" Fehler umgegangen, indem ich den Baum asynchron erweiterte und zusammenbrach. Außerdem erweitere ich von unten (Sie können sehen, wie sich die Knoten erweitern und von oben zusammenbrechen, aber nur, wenn sie in jedem Zweig zum letzten Knoten gelangt, so dass es für den Benutzer weitaus interessanter ist. Sie können tatsächlich sehen, dass es passiert, und wenn es nicht schnell ist (dh 7 und zuvor besonders langsam), ist es zumindest unterhaltsam, während sie warten.
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;
};
Andere Tipps
Fangen Sie an, Ihre Knoten mit zu bekommen yourtreeViewInstance.get_nodes()
, und dann die Kinderknoten als eachChildNode.get_nodes()
Und so weiter in der Hierarchie.
Dann können Sie jeden Element durch Anrufe erweitern .set_expanded(true);
Auf jedem Knoten möchten Sie erweitern.