фильтр jqgrid удаляет одну строку при загрузке один раз

Я построил одну сетку с помощью jqgrid и включил фильтрацию. Полученный тип данных - json, и я использую функцию loadonce. Когда я применяю некоторые фильтры, кажется, что он всегда скрывается в записи. Я использую пейджер сетки только для того, чтобы иметь дополнительные кнопки, которые я хочу добавить в сетку, и я удаляю кнопки пейджера сетки (следующий, последний и т. Д.). Я удалил пейджер, чтобы проверить, есть ли конфликт, но все равно получаю ту же ошибку. Когда сетка загружается, я получаю «Просмотр 1–7 из 7», и я вижу 7 записей, когда я применяю фильтр, на выходе получается «Просмотр 1–3 из 4». Это означает, что 4 записи соответствуют фильтру, но он продолжает отображать только 3. Теперь, если я очищаю фильтры, я получаю «Просмотр 1–6 из 7», снова одна запись отсутствует. Я проверил таблицу с помощью firebug, чтобы увидеть, скрыта ли запись, но все равно ничего. Я пробовал firefox, chrome, IE и во всех браузерах получаю ту же ошибку. Версия jqgrid - 4.1.1. Есть какие-нибудь подсказки, почему это происходит?

Ниже вы можете увидеть код:

jq($grid).jqGrid({
    url: $url,
    datatype: 'json',
    mtype: 'Get',
    colNames: colNamesList,
    colModel: $colModel,
    jsonReader : {
        repeatitems:false,
        id: "id",
    },
    rowNum: -1, 
    width: jq(document).width()-20,
    height: 200,
    pager: $pagerId,
    viewrecords: true,
    fixed: true,
    shrinkToFit: false,
    loadonce: true, 
    caption: $caption,
    beforeRequest: function(){
        if (!initialized) {
            jq(blockElement).block({ message: '<h1 class="loadingMsg">Grid is loading, please wait...</h1>' });
        }
    },
    loadComplete: function(data){
        if (loadCompleteCallback != null){
            loadCompleteCallback(data);
        }

        if (!initialized) {
            jq.jGrowl('"' + $caption + '" Grid loaded.', {header:'Load Notification'});
            jq(blockElement).unblock();
            initialized = true;
        }
    }
});

        if (!initialized) {
            jq.jGrowl('"' + $caption + '" Grid loaded.', {header:'Load Notification'});
            jq(blockElement).unblock();
            initialized = true;
        }
    }
});

jq($grid).jqGrid('filterToolbar',{
    stringResult: true,
    searchOnEnter : false
});

Заранее спасибо!


person user944643    schedule 05.10.2011    source источник


Ответы (1)


Я не понимаю следующего: почему вы возвращаете с сервера одну строку, которую никогда не хотите показывать? Не проще ли удалить данные уже на стороне сервера? Если это невозможно, вы можете удалить строку внутри loadComplete. Кстати, в текущем коде я не вижу, где вы устанавливаете настраиваемый фильтр, который делает одну строку сетки невидимой.

Еще одно замечание: никогда не используйте rowNum: -1. Разрешены только положительные значения (например, rowNum: 10000). Это особенно важно, если вы используете loadonce: true, который меняет datatype на 'local' после первого заполнения сетки. Использование отрицательного знака rowNum не допускается.

person Oleg    schedule 05.10.2011
comment
@ user944643: Не могли бы вы опубликовать точный пример, включая данные JSON, возвращенные с сервера? Вы всегда писали о фильтрации одной записи, но никогда не описываете, как вы это делаете. Какой фильтр вы установили и каким образом? Не могли бы вы опубликовать достаточно данных и кода, чтобы другие могли воспроизвести описанную проблему? - person Oleg; 05.10.2011
comment
Привет, все возвращаемые данные необходимы, и все данные представлены в сетке. при использовании фильтрации jqgrid теряет одну запись из данных. Я знаю, что loadonce получает данные с сервера один раз, а затем эти данные используются как локальные. Проблема в том, что после фильтрации одна запись всегда отсутствует в результатах. Что касается rowNum: -1, документ не указывает, что он не может принимать отрицательное значение, когда передается отрицательное значение, все данные отображаются, и кажется, что он работает, по крайней мере, до фильтрации. Завтра проверю еще раз и дам знать. - person user944643; 05.10.2011
comment
Ошибка возникает как после фильтрации, так и после сортировки. Так, например, если у меня есть в сетке следующие строки ACBDE, а заголовок будет отображать вид 1-5 из 5 после сортировки, у меня будет BCDE, и будет отображаться заголовок: вид 1-4 из 5 Другой сценарий - следующая сетка содержит следующие строки AAA AAB ABB CC, и отобразится заголовок: Просмотр 1-4 из 4 Если я введу термин фильтра A, я получу следующий AAA AAB, тогда будет отображаться заголовок: Просмотр 1-2 из 3 Всегда есть отсутствующая запись , только после сортировки и после фильтрации - person user944643; 05.10.2011
comment
@ user944643: Если вы читали описание документации по опции rowNum здесь вы обнаружите, что предложение Установите для этого параметра значение -1 (неограниченно), чтобы отключить эту проверку. удалено. До версии 3.7.2 (до введения локальной сортировки и фильтрации и опции loadonce) это было разрешено. Позже не больше. Совершенно неправильно, если вы используете локальные данные или параметр loadonce: true. - person Oleg; 05.10.2011
comment
Привет, Олег, я изменил rowNum на количество полученных максимальных результатов, и проблема решена. Странно думать, почему он работает, когда гирд загружен, отображает все записи и ломается после фильтрации или сортировки. В любом случае я предполагаю, что это будет исправлено в будущих версиях jqgrid, чтобы отображалась вся строка. Еще раз спасибо! - person user944643; 06.10.2011
comment
@ user944643: Добро пожаловать! Повторяю, не думаю, что это ошибка jqGrid. Параметр rowNum: x означает, что количество строк в сетке будет от 0 до x. Если вы используете rownumbers:true, вы увидите даже отрицательные номера строк в случае rowNum: -1. jqGrid не исправляет ошибки. Если вы воспользуетесь rowNum: "bla bla", rowNum: Inf или rowNum: function() {}, у вас также будет много проблем. Вам просто нужно использовать правильный тип и диапазон значений для всех параметров jqGrid. - person Oleg; 06.10.2011