Вопрос касательно 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, время: 16:23. |