Pregunta

Estoy siguiendo este enfoque para expandir y colapsar todos los nodos en el cliente JavaScript: http://www.telerik.com/help/aspnet/treeview/tree_expand_client_side.html

Sin embargo, está tardando mucho en procesar esto, y después de expandirse y luego colapsar, obtengo el error de "script que no responde", por lo que me preguntaba si había una manera de acelerar esto para un árbol bastante grande. ¿Hay una mejor manera de analizarlo? Actualmente, el árbol tiene 4 niveles de profundidad.

Gracias.

¿Fue útil?

Solución

Presenté los errores de "guión que no respondía" al expandir y colapsar el árbol asincrónicamente. Además, me expanio desde la parte inferior (para que pueda ver que los nodos se expanden) y colapsar desde la parte superior, pero solo cuando llega al último nodo en cada rama, por lo que es mucho más interesante para el usuario. Realmente pueden ver que suceda, y si no es rápido (es decir, IE7 y antes es particularmente lento), es al menos entretenido mientras esperan.

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

Otros consejos

Empiece a obtener sus nodos con yourtreeViewInstance.get_nodes(), y luego el niño nota como eachChildNode.get_nodes() y así sucesivamente por la jerarquía.

Entonces puede expandir cada elemento llamando .set_expanded(true); En cada nodo desea expandirse.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top