Telerik RadTreeView和客户端扩展/折叠

时间:2011-10-18 18:59:32

标签: javascript asp.net performance telerik radtreeview

我正在按照这种方法扩展和折叠客户端JavaScript中的所有节点:http://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html

然而,这需要花费很长时间来处理这个问题,然后在扩展然后崩溃之后,我得到了“脚本无响应”的错误,所以我想知道是否有办法加速这个相当大的树?有没有更好的解析方法?目前,这棵树有4层深。

感谢。

2 个答案:

答案 0 :(得分:1)

开始使用yourtreeViewInstance.get_nodes()获取节点,然后将子节点设置为eachChildNode.get_nodes(),依此类推。

然后,您可以通过在要展开的每个节点上调用.set_expanded(true);来展开每个项目。

答案 1 :(得分:1)

我通过异步扩展和折叠树来解决“脚本无响应”错误。另外,我从底部扩展(所以你可以看到节点展开)并从顶部折叠,但只有当它到达每个分支的最后一个节点时,所以在视觉上它对用户来说更有趣。他们实际上可以看到它发生,如果它不快(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;
};