Вопрос касательно jqgrid
Добрый день! Я делаю запрос на сервер, получаю оттуда данные, из которых строю уже jqgrid: dataType делаю local, подставляю colmodel, а после этого в цикле вставляю строки в таблицу. Собственно вопроса два:
1) Можно ли при подходе через dataType = local наполнять таблицу не в цикле после того, как на нее уже навешан jqGrid, т.е. сразу передать в нее строки также, как я передал colmodel 2) Второй вопрос касается pager - как ему передать, что общее количество страниц больше нуля (просто сейчас он показывает, что выведена 1 страница из 0)...
$.ajax({
url: '/path/to/php',
dataType: 'JSON',
data: {},
type: 'POST',
success: function (data) {
if (typeof void null != typeof data['colmodel'] && data['colmodel'] != null &&
typeof void null != typeof data['data'] && data['data'] != null) {
$('#ListContacts').jqGrid("clearGridData");
$('#ListContacts').jqGrid({
jsonReader: {
repeatitems: false,
id: 'NodId'
},
dataType: 'local',
colModel: data['colmodel'],
rowNum: typeof void null != typeof data['rows'] && data['rows'] != null ? data['rows'] : 20,
pager: '#ListContactsPager'
});
var rows = data['data'];
var i = 0;
while (rows[i]) {
$('#ListContacts').jqGrid('addRowData',i+1,rows[i]);
i++;
}
}
}
})
|
Отвечаю сам себе:
1) просто надо дать дополнительный параметр data: [{},{},{},...] - массив объектов, в которых хранятся строки.. ну и правильно писать datatype, а не dataType 2) с сервака передаю общее количество строк, а на клиенте параметр data добиваю пустыми объектами до нужного количества. Может и не лучший вариант, но пока работает... |
Дополню. При datatype='local' грид полагает, что ему передана не отдельная группа записей, а все данные. Это приводит к следующему эффекту: к примеру я получаю с сервера (чтобы ускорить загрузку) 20 записей и информацию о том, что их 10000. Далее дополняю их пустыми объектами:
...
success: function (data) {
var total = data[total];
var rows = data['rows']
while (rows.length < total) {
rows[rows.length] = {}
}
В таком виде мои 20 записей будут отображены на первой странице. Я переопределил обработчики кнопок пролистывания, чтобы они получали новую партию данных, но у меня упорно отображались записи в таблице undefined на всех страницах кроме первой. В итоге я пришел к выводу, что нужно смещать записи в массиве прежде, чем отдать его в jqgrid
var offset = 0;
if (typeof void null != typeof data['rowNum'] && data['rowNum'] != null &&
typeof void null != typeof data['page'] && data['page'] != null) {
offset = (data['page'] - 1) * data['rowNum'];
}
if (!isNaN(offset)) {
offset = 0;
}
var rdata = [];
while (rdata.length < offset) {
rdata[rdata.length] = {};
}
for (var i = 0; i < data['rows'].length; i++) {
rdata[rdata.length] = data['rows'][i];
}
while (rdata.length < data['total']) {
rdata[rdata.length] = {};
}
|
Еще дополню сам себе - при использовании datatype : local данные намертво фиксируются в гриде и становится проблематичным произвести обновление таблицы на новые данные. Чтобы решить эту проблему, надо принудительно подставить новые данные :
updateLocalTable: function(params){
var table = $(params.table).get(0);
var gridParams = table.p;
var data = params.data;
gridParams.data = params.rows && typeof 111 == typeof params.rows.length ? params.rows : [];
gridParams.lastpage = Math.ceil(gridParams.data.length / gridParams.rowNum);
gridParams.page = gridParams.page <= gridParams.lastpage ? gridParams.page : gridParams.lastPage;
gridParams.records = gridParams.data.length;
}
после этого можно вызвать триггер перезагрузки таблицы и все будет ОК |
| Часовой пояс GMT +3, время: 17:24. |