Подтвердить что ты не робот

Какая разница между loadComplete и gridComplete событиями?

Этот вопрос возник после того, как я просмотрел этот ответ Oleg и демонстрационные сетки в нем.

gridComplete:

Это срабатывает после того, как все данные загружены в сетку, и все остальные процессы завершены. Также событие срабатывает независимо от datatype и после сортировки пейджинга и т.д.

loadComplete:

Это событие выполняется сразу после каждого запроса сервера. данные Данные из ответа в зависимости от параметра сетки данных

Из этих документов я понял, что gridComplete запускается в конце сетки чертежа, а loadComplete запускается после завершения jqGrid связи с бэкэнд.

И поэтому мне интересно - почему в демонстрационных версиях loadComplete используется для изменения цвета ячеек, а не gridComplete?

4b9b3361

Ответ 1

Я думаю, что этот вопрос задают многие пользователи jqGrid. Поэтому интересно узнать ответ.

Я лично предпочитаю использовать loadComplete. Если вы изучите код из всех моих примеров, которые я опубликовал, вы найдете gridComplete только в том случае, если исходный плакат разместил его в вопросе, и я бы модифицировал небольшой код. Я предпочитаю использовать loadComplete из-за некоторых преимуществ loadComplete и недостатков gridComplete.

Вот преимущества loadComplete:

  • Это последний обратный вызов, который будет вызываться, если весь корпус сетки будет перезагружен. Например, после загрузки страницы на сетке с сервера. Важно понимать, что если пользователь изменяет сортировку какого-либо столбца или устанавливает фильтр или выбирает другую страницу сетки; тело сетки будет перезагружено.
  • loadComplete имеет параметр data, который представляет полную страницу локальных данных или полные данные, загруженные с сервера.

С другой стороны gridComplete будет вызываться (в текущей версии jqGrid 4.4.4) из внутреннего updatepager (см. здесь), который будет вызываться из delRowData (см. здесь), addRowData (см. здесь) и clearGridData (см. здесь); в дополнение до addXmlData (см. здесь) и addJSONData (см. здесь). Это не то, что больше всего нужно.

Другим недостатком gridComplete можно узнать, проверяет ли код addXmlData (см. здесь) и addJSONData (см. здесь), откуда вызывается updatepager и поэтому будет вызываться gridComplete. Если вы используете loadonce: true, а внутренние параметры data и _index будут заполнены полными данными, возвращаемыми с сервера. При использовании loadonce: true можно увидеть; обратный вызов gridComplete вызывается после того, как первая страница данных будет загружена из раздела. В настоящий момент data и _index содержат только данные для страницы. С другой стороны loadComplete будет вызываться позже после того, как все данные, возвращенные с сервера, будут обработаны и сохранены локально в data и _index.

Если вы загружаете данные с сервера, и если вы не используете опцию loadonce: true, clearGridData, addRowData и delRowData, тогда вы можете использовать gridComplete вместо loadComplete.

Ответ 2

Глядя на источник jqGrid (источник), вы можете видеть, что gridComplete вызывается только по одной строке grid.base.

1725: if($.isFunction(ts.p.gridComplete)) {ts.p.gridComplete.call(ts);}

Эта строка исходит из функции updatePager.

Вы можете найти loadComplete в функции populate (строка 1757). В отличие от gridComplete, он получает дополнительный параметр. Оба обратных вызова получают ссылку на this, но loadComplete также получает данные, возвращенные с сервера (или переданные локально):

1858: case "xmlstring": 
if(lcf) {ts.p.loadComplete.call(ts,dstr);}

1869: case "jsonstring": 
if(lcf) {ts.p.loadComplete.call(ts,dstr);}

1881: 
case "local":
case "clientside":
if(lc) { lc.call(ts,req); }

Дело в том, что функции populate и updatePager часто происходят в тандеме, поэтому вы видите, что при сортировке и подкачке вызываются оба обратных вызова. Разница еще раз заключается в том, что loadComplete передается дополнительный параметр.

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