1
votes

Sélection de ligne à l'aide de forEachNode très lente

J'utilise AG Grid React. J'ai mille lignes de données. J'essaie de sélectionner une plage de lignes en fonction de leurs indices.

    gridOptions.api.forEachNode(node => {
        if (node.childIndex >= startIndex && node.childIndex < endIndex) {
            node.setSelected(true)
        }
    });

Cela s'avère être très triste et prend généralement 30 secondes sur l'interface utilisateur. On dirait que setSelected déclenche plusieurs cycles de rendu. Quelle est la bonne façon de procéder?


1 commentaires

AG est juste lent, votre code n'est pas faux. Assurez-vous de ne pas désactiver la virtualisation car cela semble lent, même pour AG. J'avais environ 700 articles et j'ai pris quelques secondes, ce qui semblait mauvais.


3 Réponses :


0
votes

Vous pouvez essayer d'utiliser la pagination pour charger le bloc de données qui contient toutes les données. Documents de pagination


1 commentaires

La pagination peut ne pas aider car la taille de page minimale pourrait être d'environ 100 et ce problème est important même avec 20 à 30 lignes.



0
votes

Assurez-vous que vous ne vous êtes pas abonné à des événements susceptibles de ralentir votre code, par exemple onRowSelected, onSelectionChanged. Ceux-ci sont déclenchés pour chaque

node.setSelected (vrai)

Si vous avez l'un de ces événements souscrits, une façon possible de résoudre ce problème est de vous désabonner avant la boucle, puis de vous réinscrire après la boucle.

De plus, selon votre cas d'utilisation, vous voudrez peut-être utiliser

forEachNodeAfterFilter (nœud)

pour ne boucler que sur les nœuds visibles au lieu de

forEachNode (nœud)


1 commentaires

J'ai essayé forEachNodeAfterFilter - des résultats similaires. Je dois quelque chose avec les événements, c'est pourquoi il ne sert à rien de souscrire après la sélection.



4
votes

Le problème est que - setSelected (newValue) distribue les événements. Lorsque nous le faisons dans une boucle pour mille éléments ( disons ) - il y a mille événements, mille demandes en file d'attente pour une mise à jour asynchrone dans React qui peut être expliquée tout le retard.

Je l'ai corrigé en utilisant une autre version de setSelected - setSelected (newValue, clearSelection, suppressFinishActions) . Malheureusement, cela n'est pas écrit dans la documentation officielle. L'idée est d'utiliser cette version pour toutes les sélections sauf la dernière , afin que toutes les expéditions d'événements soient supprimées et d'utiliser la sélection normale que nous utilisons depuis toujours pour sélectionner le dernier élément afin qu'il déclenche également nécessaire événements pour que onRowSelected , onSelectionChanged , etc. pour fonctionner normalement.

        this.api.forEachNodeAfterFilter(node => {
            if (node.childIndex >= startIndex && node.childIndex < endIndex) {
                selectedNodes.push(node);
            }
        });

        if (selectedNodes.length > 0) {
            // setSelected re-renders every time so use suppressFinishActions except last one
            for (let i = 0; i < selectedNodes.length - 1; i++) {
                selectedNodes[i].setSelected(true, false, true);
            }
            selectedNodes[selectedNodes.length - 1].setSelected(true);
        }


2 commentaires

@Dominic Est-ce utile dans votre cas?


Comment faire cela pour le modèle de ligne côté serveur?