Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.10.2012, 09:46
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Вопрос касательно 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++;
                        }
                    }
                }
            })
Ответить с цитированием
  #2 (permalink)  
Старый 21.10.2012, 13:34
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Отвечаю сам себе:
1) просто надо дать дополнительный параметр data: [{},{},{},...] - массив объектов, в которых хранятся строки.. ну и правильно писать datatype, а не dataType
2) с сервака передаю общее количество строк, а на клиенте параметр data добиваю пустыми объектами до нужного количества. Может и не лучший вариант, но пока работает...

Последний раз редактировалось demoniqus, 21.10.2012 в 14:51.
Ответить с цитированием
  #3 (permalink)  
Старый 22.10.2012, 12:50
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Дополню. При 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] = {};
                        }
Ответить с цитированием
  #4 (permalink)  
Старый 16.10.2013, 16:41
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Еще дополню сам себе - при использовании 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;
    }

после этого можно вызвать триггер перезагрузки таблицы и все будет ОК
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос касательно применения полиграфии в вебе Антон Крамолов Оффтопик 7 01.08.2012 04:26
Вопрос по jqgrid ceskf jQuery 0 22.09.2011 15:55
Вопрос касательно незаполняемости блока. 0931454574 (X)HTML/CSS 5 10.06.2011 10:39
Вопрос по поводу jqGrid Vasiliusis Библиотеки/Тулкиты/Фреймворки 2 26.11.2010 17:58
Вопрос по jqgrid LorDEreTik jQuery 0 29.06.2010 18:39