2012-03-05 2 views
2

Я использую jqgrid treegrid для удаленного доступа к данным при расширении события. Он быстро извлекает данные, но для загрузки на стороне клиента требуется время, а также при свертывании узла, он дает ошибку стоп-скрипта в IE8. В FF и Chrome это требует времени, но не работает с ошибками скрипта. У меня есть только 480 записей, но treegrid показывает огромный недостаток производительности. IE8 ошибка разрушающегося февраля-2012 узел ...Проблемы с производительностью jggrid treegrid в IE8

enter image description here

ответ

3

Я проверил свой дема и у меня есть один совет горячего, чтобы улучшить производительность резко. Причиной являются the line внутри expandRow:

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

и another line внутри collapseRow:

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

Линии использует $t.grid.bDiv в качестве параметра контекста JQuery. Из этого следует, что данные из $t.grid.bDiv заполняются без использования индекса, существующего для идентификаторов. В случае, если в сетке нет дубликатов идентификаторов (что было бы ошибкой в ​​данных), можно удалить параметр $t.grid.bDiv

The demo идентичен вашей первоначальной демонстрации, но я использовал фиксированный код функции, где указанные строки заменяются на

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

и

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

Я использовал оригинальный jqGrid 4.1.1 jquery.jqGrid.min.js, но переписал Кодекса только expandRow и collapseRow FUNC Тион с

$.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); 
       } 
      }); 
     }); 
    } 
}); 

Я думаю, что можно более улучшить производительность кода, но, по крайней мере, простое изменение может существенно повысить производительность разрушения или расширения узлов дерева, имеющие много элементов.

ОБНОВЛЕНО: Я отправил только the pull request, которые исправляют описанную выше проблему в основном коде jqGrid. Я решил использовать $($t.rows.namedItem(id)) вместо описанного выше $ ("#" + $. Jgrid.jqID (id)). Я точно не оценивал производительность, но использование namedItem должно быть самым близким к исходному коду jqGrid, и я надеюсь, что он работает немного быстрее, как селектор jQuery.

ОБНОВЛЕНО 2: Исправление теперь в главном коде jqGrid на GitHub (см here)

+0

Олег: Отлично! не могу вас поблагодарить. Производительность, безусловно, намного лучше ... – varaprakash

+0

@varaprakash: Добро пожаловать! Я вижу, что текущий код TreeGrid можно улучшить гораздо лучше для лучшей производительности, но я надеюсь, что я нашел узкое место, которое у вас было. Я трачу около 10 минут, чтобы найти проблему и исправить ее. Гораздо больше времени взяли написание ответа :-). В любом случае вы можете видеть на примере, что у вас есть полная рабочая демонстрация, которая воспроизводит проблему, которая ускоряет решение проблемы. С наилучшими пожеланиями! – Oleg

+0

Да, я видел демо. Ваши демонстрации всегда полезны, и я уверен, что эта проблема может возникнуть у большинства пользователей treegrid, и этот пример определенно помогает многим. Еще раз спасибо! – varaprakash

Смежные вопросы