Почему GridView: true используется и что это значит?

Я работаю над JqGrid.

Я хочу знать, что это значит, если мы указать gridview:true.

и в каких случаях нужно предоставлять ?

недавно я работал над одним таким jqGrid и my afterInsertRow не был призван, когда я remvoed в gridview:true теперь вызова.

Это один случай, который я сам испытал, мне было интересно, есть ли другие случаи, которые мы должны знать, если Это.

пожалуйста, руководство меня на этом.

2 ответов


я согласен с этим gridview: true опция не хорошо объяснена в документации. В некоторых случаях (например, в случае TreeGrid) опция будет установлена автоматически. Поэтому я пытаюсь объяснить, что это значит и почему я рекомендую всегда использовать gridview: true опция и никогда не использовать afterInsertRow.

многие люди начинают с некоторых других языков программирования, как JavaScript и написать свою первую программу, которая выполняется в веб-браузере после того, как они имеют некоторый стиль написания программ. У меня была такая же проблема 3 года до. важно понимать, что должен делать веб-браузер после внесения некоторых изменений на HTML-странице. В использовании использования jQuery это то, что вы постоянно делаете.

если вы измените какой-либо элемент DOM на странице, позиция на всех других элементах DOM, существующих на странице, может быть изменена. Если вы думаете о плавающей модели (например, с float: left) или многие другие настройки CSS вы поймете, что веб-браузер не может просто переместить растровое представление существующей страницы и вставить новый элемент. Так что веб-браузер должен пересчитать положение всех элементов, существующих на странице и переместить некоторые из элементов на другое место. Даже если вы измените стиль CSS элемента, произойдет так называемое оплавление. Я бы рекомендовал вам прочитать статьи и посмотреть видео о предмете.

основная идея для повышения производительности веб-браузера описанный выше случай будет для уменьшения количества изменений на странице. Так что вам нужно изменить 5 стилей одного элемента DOM, вы должны сделать это за одну операцию. Вы можете использовать jQuery.css({...}) со всеми измененными стилями вместо 5 отдельных вызовов. Еще лучше было бы определить один класс CSS и использовать jQuery.addClass метод.

в случае jqGrid нужно заполнить <tbody> со всеми строками и ячейками сетки. Если вы используете gridview: true опция затем jqGrid собирает содержимое всех строк в виде строк с HTML фрагментарный. Позже вызов jqGrid jQuery.append на строку, который установлен внутри innerHTML свойство для установки всего фрагмента HTML на странице.

по той же причине вы должны использовать cellattr, rowattr или пользовательские модули форматирования который работает с фрагментами HTML, представленными ячейками или строками как строки. В конце строки будут добавлены к другим строкам и будут использоваться в jQuery.append операции, как я описал выше.

использование afterInsertRow функция обратного вызова требует, чтобы каждая строка сетки была поместить на странице перед вызовом afterInsertRow обратный. Таким образом, это делает невозможным использование gridview: true опция и сделать работу страницы медленно.

чтобы быть точным, я должен упомянуть, что снижение производительности, которое я описал ранее, может быть видно только в случае большой сетки и будет в основном ясно видно в случае медленного веб-браузера (например, интернет Explorer, особенно старые версии IE).


по словам документация jqGrid на gridview:

в предыдущих версиях jqGrid, включая 3.4.X, чтение относительно большого набора данных (количество строк >= 100 ) вызвало проблемы со скоростью. Причиной этого было то, что, поскольку каждая ячейка была вставлена в сетку, мы применили к ней от 5 до 6 вызовов jQuery. Теперь эта проблема решена; теперь мы вставляем строку ввода сразу с добавлением jQuery. Результат впечатляет-примерно в 3-5 раз быстрее. Каков будет результат, если мы вставим все данные сразу? Да, это можно сделать с помощью опции gridview (установите ее в true). В результате получается сетка, которая в 5-10 раз быстрее. Конечно, когда эта опция установлена в true, у нас есть некоторые ограничения. если установлено значение true, мы не можем использовать treeGrid, subGrid или событие afterInsertRow. Если вы не используете эти три параметра в сетке, вы можете установить этот параметр в true и наслаждаться скоростью.

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


для чего это стоит, вы можете на самом деле см. конкретные случаи на grid.base.js методы addXmlData и addJSONData здесь afterInsertRow пропускается:

if(ts.p.gridview === false ) {
    $("tbody:first",t).append(rowData.join(''));
    $(ts).triggerHandler("jqGridAfterInsertRow", [rid, rd, xmlr]);
    if(afterInsRow) {ts.p.afterInsertRow.call(ts,rid,rd,xmlr);}
    rowData=[];
}

ограничения treeGrid и subGrid больше тонкие и явно не вызываются в коде.