Telerik Radtreeview и Client Side Expand/Coolapse
-
26-10-2019 - |
Вопрос
Я следую за этим подходом к расширению и разрушению всех узлов в клиентском JavaScript: http://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html
Тем не менее, для обработки этого требуется очень много времени, и после расширения, затем обрушившись, я получаю ошибку «безжалостного сценария», поэтому мне было интересно, есть ли способ ускорить это для довольно большого дерева? Есть ли лучший способ проанализировать это? В настоящее время дерево имеет глубину 4 уровня.
Спасибо.
Решение
Я обошел ошибки "безжалостного сценария", расширяя и обрушив дерево асинхронно. Кроме того, я расширяюсь снизу (так что вы можете увидеть расширение узлов) и рухнуть сверху, но только когда он достигает последнего узла в каждой ветви, так что визуально это гораздо интереснее для пользователя. Они на самом деле могут видеть, что это произошло, и если это не быстро (IE7 и до того, как это особенно медленно), это, по крайней мере, интересно, пока они ждут.
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;
};
Другие советы
Начните получать свои узлы с yourtreeViewInstance.get_nodes()
, а затем дочерние узлы как eachChildNode.get_nodes()
И так далее вниз по иерархии.
Затем вы можете расширить каждый элемент, позвонив .set_expanded(true);
На каждом узле вы хотите расширить.