bootstrap - jqgrid viewrecords



Problèmes de performances Jqgrid treegrid dans IE8 (1)

J'utilise jqgrid treegrid pour charger les données à distance sur l'événement de développement. Il récupère les données rapidement mais il faut du temps pour charger du côté client et aussi pour réduire le nœud, cela donne une erreur de script d'arrêt sur IE8. Sur FF et Chrome, cela prend du temps mais fonctionne sans aucune erreur de script. Je n'ai que 480 enregistrements à afficher, mais Treegrid montre un énorme inconvénient de performance. Erreur IE8 sur le nœud FEB-2012 de réduction ...


Answer #1

J'ai testé ta démo et j'ai une astuce pour améliorer radicalement les performances. La raison est la ligne à l' intérieur de expandRow :

$("#"+id,$t.grid.bDiv).css("display","");

et une autre ligne à l' intérieur de collapseRow :

$("#"+id,$t.grid.bDiv).css("display","none");

Les lignes utilisent $t.grid.bDiv comme paramètre de contexte jQuery. Il s'ensuit que les données de $t.grid.bDiv fill doivent être recherchées sans utiliser l'index existant pour les ids. Dans le cas où la grille n'a pas de doublons d'id (ce qui serait un bogue dans les données), on peut supprimer le paramètre $t.grid.bDiv

La démo est identique à votre démo originale, mais j'ai utilisé le code fixe de la fonction où les lignes ci-dessus sont remplacées

$("#"+$.jgrid.jqID(id)).css("display","");

et

$("#"+$.jgrid.jqID(id)).css("display","none");

J'ai utilisé le jquery.jqGrid.min.js 4.1.1 d'origine jquery.jqGrid.min.js , mais écrasé le code seulement les fonctions expandRow et collapseRow avec

$.jgrid.extend({
    expandRow: function (record){
        this.each(function(){
            var $t = this;
            if(!$t.grid || !$t.p.treeGrid) {return;}
            var childern = $($t).jqGrid("getNodeChildren",record),
            //if ($($t).jqGrid("isVisibleNode",record)) {
            expanded = $t.p.treeReader.expanded_field;
            $(childern).each(function(i){
                var id  = $.jgrid.getAccessor(this,$t.p.localReader.id);
                //$("#"+id,$t.grid.bDiv).css("display","");
                $("#"+$.jgrid.jqID(id)).css("display","");
                if(this[expanded]) {
                    $($t).jqGrid("expandRow",this);
                }
            });
            //}
        });
    },
    collapseRow : function (record) {
        this.each(function(){
            var $t = this;
            if(!$t.grid || !$t.p.treeGrid) {return;}
            var childern = $($t).jqGrid("getNodeChildren",record),
            expanded = $t.p.treeReader.expanded_field;
            $(childern).each(function(i){
                var id  = $.jgrid.getAccessor(this,$t.p.localReader.id);
                //$("#"+id,$t.grid.bDiv).css("display","none");
                $("#"+$.jgrid.jqID(id)).css("display","none");
                if(this[expanded]){
                    $($t).jqGrid("collapseRow",this);
                }
            });
        });
    }
});

Je pense que l'on peut améliorer les performances du code, mais au moins le simple changement peut améliorer considérablement les performances de l'effondrement ou de l'expansion des nœuds d'arborescence ayant de nombreux éléments.

MISE À JOUR: J'ai posté tout à l'heure la requête de tirage qui corrige le problème décrit ci-dessus dans le code principal de jqGrid. J'ai décidé d'utiliser $($t.rows.namedItem(id)) au lieu de décrit ci-dessus $ ("#" + $. Jgrid.jqID (id)). Je n'ai pas mesuré la performance exactement, mais l'utilisation de namedItem devrait être la plus proche du code original de jqGrid et j'espère que cela fonctionnera un peu plus rapidement en tant que sélecteur d'id de jQuery.

MISE À JOUR 2: Le correctif est maintenant dans le code principal de jqGrid sur le github (voir ici )