Недавно я написал ответ на вопрос "jqGrid показывать сообщение по умолчанию "погрузка" при обновлении таблицы/на пользовательском обновлении". При написании ответа я подумал: почему он использует функцию addJSONData() для обновления данных в сетке вместо изменения URL-адреса в отношении setGridParam() и обновления данных jqGrid в отношении триггера ('reloadGrid')? Сначала я хотел рекомендовать использовать reloadGrid, но, подумав об этом, я понял, что не совсем уверен, что лучший способ. По крайней мере, я не могу объяснить в двух предложениях, почему я предпочитаю второй путь. Поэтому я решил, что это может быть интересным предметом обсуждения.
Итак, мы имеем типичную ситуацию. У нас есть веб-страница с хотя бы одним jqGrid и некоторыми другими элементами управления, такими как комбинированные поля (selects), флажки и т.д., Которые дают возможность пользователю изменять область информации, отображаемой в jqGrid. Обычно мы определяем какой-либо обработчик событий, например jQuery("#selector").change(myRefresh).keyup(myKeyRefresh)
и нам нужно перезагрузить контейнер jqGrid на основе пользовательских вариантов.
После чтения и анализа информации из дополнительного пользовательского ввода мы можем обновить контейнер jqGrid по меньшей мере двумя способами:
- Сделайте вызов
$.ajax()
вручную, а затем внутри успешного или полного дескриптора вызова$.ajax
jQuery.parseJSON()
(илиeval
), а затем вызовите функцию addJSONData из jqGrid. Я нашел много примеров на stackoverflow.com, которые используют addJSONData. - Обновить url jqGrid на основе пользовательского ввода, reset current 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, например, ошибок, завершения и событий 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>' });
перед вызовом метода trigger ('reloadGrid') и jQuery ('# main'). unblock() внутри функций loadComplete и loadError. В этом случае параметр loadui может быть установлен на "disable".
И мое последнее замечание: В основном я использовал для создания jqGrid с datatype, установленным в 'local' вместо 'json', и я бы назвал функцию триггера ('change') некоторых из элементы управления (один из списков со списком):
jQuery("#selector").change(myRefresh).keyup(myKeyRefresh).trigger('change')
.
Таким образом, я строю параметр url jqGrid только в одном месте внутри дескриптора изменения и изменяю тип данныхto 'json' внутри описанного выше setGridParam().
Поэтому я не понимаю, почему функция addJSONData() должна использоваться когда-либо.
Может ли кто-нибудь, кто использует функцию addJSONData(), объяснить мне преимущества его использования?
Чтобы быть справедливым, я могу добавить, что addJSONData(), который существует в более ранних версиях jqGrid, как имеющий большинство функций, которые я описываю здесь. Следует ли заменить использование addJSONData jqGrid на использование setGridParam() и trigger ('reloadGrid')?