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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top