Domanda

Sto seguendo questo approccio per espandere e comprimere tutti i nodi client JavaScript: http://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html

Tuttavia, sta prendendo un sacco di tempo per elaborare questo, e dopo l'espansione poi crollare, ottengo l'errore "di script non risponde", quindi mi chiedevo se ci fosse un modo per accelerare questo per una piuttosto grande albero? C'è un modo migliore per analizzarlo? Attualmente, l'albero è di 4 livelli di profondità.

Grazie.

È stato utile?

Soluzione

ho ottenuto intorno agli errori "di script che non rispondono" espandendo e comprimendo l'albero in modo asincrono. Inoltre, espando dal basso (in modo da poter vedere i nodi espandono) e collasso dall'alto, ma solo quando si arriva all'ultimo nodo in ciascun ramo, così visivamente è molto più interessante per l'utente. Si può effettivamente vedere accadere, e se non è veloce (IE7 e prima è particolarmente lenta), è almeno intrattenere mentre aspettano.

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;
};

Altri suggerimenti

Avvia fuori ottenere i nodi con yourtreeViewInstance.get_nodes(), e poi i nodi figlio come eachChildNode.get_nodes() e così via fino alla gerarchia.

Quindi è possibile espandere ogni elemento chiamando .set_expanded(true); in ogni nodo si desidera espandere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top