Недавно я написал ответ на вопрос « jqGrid отображает сообщение« загрузка »по умолчанию при обновлении таблицы / при пользовательском обновлении ». При написании ответа я подумал: почему он использует функцию addJSONData () для обновления данных в сетке вместо изменения URL-адреса относительно setGridParam () и обновления данных jqGrid с помощью уважение к триггеру ('reloadGrid') ? Вначале я хотел порекомендовать использовать 'reloadGrid' , но подумав об этом, я понял, что не совсем уверен, как лучше. По крайней мере, я не могу объяснить в двух предложениях, почему я предпочитаю второй путь. Поэтому я решил, что это может быть интересным предметом обсуждения.
Итак, чтобы быть точным: у нас типичная ситуация. У нас есть веб-страница с хотя бы одним jqGrid и некоторыми другими элементами управления, такими как комбинированные поля (флажки), флажки и т. Д., Которые дают пользователю возможность изменять область действия информации, отображаемой в jqGrid. Обычно мы определяем некоторый обработчик событий, например jQuery("#selector").change(myRefresh).keyup(myKeyRefresh)
и нам нужно перезагрузить контейнер jqGrid в зависимости от выбора пользователя.
После прочтения и анализа информации, полученной от дополнительных данных пользователя, мы можем обновить контейнер jqGrid как минимум двумя способами:
- Выполните вызов
$.ajax()
вручную, а затем внутри успешного или полного дескриптора $.ajax
, вызовите jQuery.parseJSON()
(или eval
) и затем вызовите addJSONData функцию jqGrid. Я нашел много примеров на stackoverflow.com, которые используют addJSONData .
- Обновите url jqGrid на основе введенных пользователем данных, сбросьте текущий номер page на 1 и при необходимости измените заголовок сетки. Все это может быть сделано в отношении setGridParam () и, необязательно, setCaption () jqGrid. В конце вызовите функцию сетки ('reloadGrid') . Чтобы создать url , кстати, я использую в основном функцию jQuery.param, чтобы быть уверенным, что все параметры URL правильно упакованы относительно encodeURIComponent .
Я бы хотел, чтобы мы обсудили преимущества и недостатки обоих способов. В настоящее время я использую второй способ, поэтому начну с его преимуществ.
Можно сказать: я вызываю существующую веб-службу, преобразую полученные данные в формат jqGrid и вызываю addJSONData . Вот почему я использую метод addJSONData !
ОК, я выберу другой путь. jqGrid может напрямую вызывать веб-сервис и заполнять результаты в сетке. Существует множество опций jqGrid, которые позволяют настроить этот процесс.
Прежде всего, можно удалить или переименовать любой стандартный параметр, отправленный на сервер в отношении опции prmNames jqGrid, или добавить дополнительные параметры в отношении postData опция (см. http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options).. Можно изменить все созданные параметры непосредственно перед тем, как jqGrid сделает соответствующий запрос $.ajax
, определив функцию serializeGridData () (еще одна опция jqGrid). Более того можно изменить каждый параметр $.ajax
, установив параметр ajaxGridOptions в jqGrid. Я использую ajaxGridOptions: {contentType: "application/json"}
, например, в качестве общего параметра $.jgrid.defaults
.
Опция ajaxGridOptions очень мощная. Что касается опции ajaxGridOptions , можно переопределить любой параметр $.ajax
запроса, отправляемого jqGrid, например error , complete и beforeSend События. Я считаю потенциально интересным определить событие dataFilter , чтобы иметь возможность вносить любые изменения в данные строки, возвращаемые с сервера.
Еще один аргумент в пользу использования триггера ('reloadGrid') - это блокировка jqGrid во время обработки запроса AJAX. В основном я использую параметр loadui: 'block'
для блокировки jqGrid при отправке JSON-запроса на сервер. Что касается плагина jQuery blockUI http://malsup.com/jquery/block/, можно блокировать больше частей веб-страницы только в виде сетки. Для этого можно позвонить:
jQuery('#main').block({ message: '<h1>Die Daten werden vom Server geladen...</h1>' });
перед вызовом триггера ('reloadGrid') и jQuery ('# main'). Unblock () внутри loadComplete и loadError функции. В этом случае для параметра loadui может быть установлено значение «отключить».
И мое последнее замечание: в основном я использовал для создания jqGrid с типом 1108 *, установленным в 'local' вместо 'json', и я бы назвал триггер ('change') Функция некоторых элементов управления (один из выпадающих списков), таких как:
jQuery("#selector").change(myRefresh).keyup(myKeyRefresh).trigger('change')
.
Таким образом, я создаю параметр url в jqGrid только в одном месте внутри дескриптора изменения и меняю тип данных на 'json' внутри описанного выше setGridParam () .
Так что я не понимаю, почему функцию addJSONData () следует когда-либо использовать.
Может ли кто-нибудь, кто использует функцию addJSONData () , объяснить мне преимущества ее использования?
Чтобы быть справедливым, я могу добавить, что addJSONData () , который существует в более старых версиях jqGrid, как обладающий большинством функций, которые я здесь описываю. Следует ли заменить использование addJSONData в jqGrid на использование setGridParam () и trigger ('reloadGrid') ?