Пример этого сценария можно найти на http://trirand.com/blog/jqgrid/jqgrid.html, если вы выберете «Дополнительно», а затем «Основные детали». Ниже я приведу небольшой вариант кода.
Допустим, у нас есть две сетки на HTML-странице: одна «основная» сетка и другая «подробная» сетка, которая должна загружать данные на основе строки, выбранной в главной сетке. Давайте обе сетки должны заполнять данные с сервера, который отправляет данные обратно в формате JSON. Мы предполагаем, что мы используем выделение одной строки (не определено multiselect: true
) в основной сетке.
Вот шаблон кода
var detailsTitle = 'Details';
var grid = jQuery('#master').jqGrid({ // ... some parameters
url: masaterUrl,
datatype: 'json',
colModel: [ // ... some column definitions
{ name: 'Name', width: 120 }
],
onSelectRow: function(id) {
var selName = grid.getCell(id, 'Name');
gridDetails.setCaption(detailsTitle + ' for "' + selName + '"');
gridDetails.setGridParam({
//url: urlGetDetail + '/' + encodeURIComponent(id),
//url: urlGetDetail + '?' + $.param( { userId: id });
postData: { userId: id },
page: 1,
datatype: 'json' }).trigger('reloadGrid');
}
}).navGrid('#pager', {}, {}, {}, {
afterSubmit: function(response, postdata) {
gridDetails.setCaption(detailsTitle);
gridDetails.setGridParam({ datatype: 'local',
page: 1 }).trigger('reloadGrid');
return [true, ''];
}
});
var gridDetails = jQuery('#detail').jqGrid({ // ...
caption: detailsTitle,
url: urlDetail,
//postData: { userId: function() { return grid.getGridParam('selrow'); } },
datatype: 'local'
});
Теперь несколько комментариев к коду. В начале ни одна строка не будет выбрана в основной сетке. Поэтому мы устанавливаем datatype: 'local'
в качестве параметра сетки данных, чтобы запретить загрузку данных.
Если будет выбрана строка в основной сетке, мы устанавливаем заголовок (заголовок) сетки сведений, меняем datatype
сетки сведений на 'json'
и устанавливаем page: 1
. Сброс параметра page
важен, поскольку он будет отправлен на сервер в качестве дополнительного параметра. Если при последнем выборе пользователь выбрал другую страницу ранее, и для нового выбора не так много строк данных, как прежде, чем сетка сведений могла бы быть пустой. Чтобы решить эту проблему, мы должны всегда устанавливать page
в 1.
Теперь основная работа: отправка id
главной сетки в качестве параметра запроса сервера для сетки данных. У нас есть несколько вариантов здесь:
- мы можем добавить URL-адрес сетки данных строкой, подобной
'?userId='+id
. Чтобы сделать это более тщательно, мы должны принять во внимание, что id
может иметь некоторые специальные символы. Поэтому, чтобы быть уверенным, мы должны использовать '?userId='+encodeURIComponent(id)
вместо этого. Функция jQuery.param
делает то же самое в более читаемой форме. Таким образом, мы можем использовать '?'+jQuery.param({userId:id})
вместо этого. Я рекомендую использовать способ, если url
сетки данных должен быть в формате REST (например, «blabla / id»). В этом случае установка url
сетки данных на urlDetail+'/'+encodeURIComponent(id)
, вероятно, является наилучшим способом.
- мы можем установить параметр
postData:{userId:id}
. То же самое, что и '?'+jQuery.param({userId:id})
, если мы используем HTTP GET для запросов к серверу. Преимущество этого способа заключается в том, что мы используем также HTTP POST. Тогда параметры будут размещены в теле, а не добавлены к URL. Так что использование postData
имеет небольшое преимущество.
- мы можем удалить код из события
onSelectRow
главной сетки и включить в детальную сетку дополнительный параметр postData
в качестве функции (см. Строку с комментариями). Способ будет работать очень хорошо с небольшими исключениями. Например, нам будет сложно очистить сетку сведений, если выбранная строка в основной сетке будет удалена. В некоторых других ситуациях у нас также меньше гибкости. Поэтому я хотел упомянуть только эту возможность, но я включил ее только в качестве комментария (см. Как фильтровать данные jqGrid, НЕ используя встроенное поле поиска / фильтра , если у вас есть интерес к этому способу).