Telerik RadTreeView и на стороне клиента Развернуть / Свернуть - PullRequest
0 голосов
/ 18 октября 2011

Я придерживаюсь этого подхода к развертыванию и свертыванию всех узлов в клиентском JavaScript: http://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html

Тем не менее, это занимает ДЕЙСТВИТЕЛЬНО много времени, чтобы обработать это, и после развертывания, а затем свертывания, я получаю ошибку «скрипт не отвечает», поэтому мне было интересно, есть ли способ ускорить это для довольно большого дерева? Есть ли лучший способ разобрать это? В настоящее время дерево имеет 4 уровня глубины.

Спасибо.

Ответы [ 2 ]

1 голос
/ 19 августа 2013

Я справился с ошибками «сценарий не отвечает», развернув и свернув дерево асинхронно. Кроме того, я расширяюсь снизу (чтобы вы могли видеть, как расширяются узлы) и сворачивается сверху, но только тогда, когда он достигает последнего узла в каждой ветви, так что визуально это гораздо интереснее для пользователя. Они действительно могут увидеть, как это происходит, и если это не так быстро (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;
};
1 голос
/ 15 ноября 2011

Начните получать ваши узлы с yourtreeViewInstance.get_nodes(), а затем дочерние узлы как eachChildNode.get_nodes() и так далее по иерархии.

Затем вы можете расширить каждый элемент, вызвав .set_expanded(true); на каждом узле, который вы хотите расширить.

...