jqGrid Обновление с сервера Проблема

У меня есть страница Struts2 jqGrid, которая загружается нормально. При нажатии кнопки обновления навигатора я хочу, чтобы он перезагрузил сетку с сервера.

    <sjg:grid
        altRows="false"
        id="gridtable"
        dataType="json"
        editurl="%{editurl}"
        filter="true"
        filterOptions="{stringResult:true}"
        gridModel="gridModel"
        gridview="true"
        height="600"
        href="%{remoteurl}"         
        loadonce="true"
        navigator="true"
        navigatorAdd="%{editPermission}"
        navigatorAddOptions="{
            closeAfterAdd:false,
            closeOnEscape:true,
            reloadAfterSubmit:true,
            addCaption:'Add Record'}" 
        navigatorDelete="false"
        navigatorEdit="%{editPermission}"
        navigatorEditOptions="{
            closeAfterEdit:false,
            closeOnEscape:true,
            afterSubmit:function(response, postdata) {
                        return isError(response.responseText);
                     }
        }"
        navigatorRefresh="true"
        navigatorSearch="false"
        onCompleteTopics="loadComplete"
        onSelectRowTopics="rowselect"
        onEditInlineBeforeTopics="beforeFormLoad"
        pager="true"
        pagerButtons="true"
        rowList="25,50,100"
        rowNum="25"
        rownumbers="true"
    >

У меня есть следующая привязка, чтобы установить тип данных в json при нажатии кнопки обновления.

$("#refresh_gridtable").bind("click", function(){
    $("#gridtable").jqGrid("setGridParam", {datatype: 'json'});
    return [true];
});

Однако, когда я нажимаю кнопку обновления, он перезагружает данные с сервера только при каждом втором нажатии. Если я выполняю сортировку на стороне клиента для определенного столбца, а затем нажимаю «Обновить», он не будет перезагружаться с сервера при первом щелчке, второй щелчок будет обновляться с сервера без сортировки (значки сортировки все еще видны в этот момент вверху столбца), то третий щелчок не затронет сервер, но применит сортировку.

Как заставить обновление перезагружаться с сервера каждый раз, а затем применять любые существующие поля сортировки/фильтрации?


person user3420328    schedule 19.06.2015    source источник


Ответы (1)


Решение немного зависит от базового jqGrid, который вы используете. Если вы используете бесплатную версию jqGrid 4.9, вы можете просто использовать дополнительную опцию navGrid: reloadGridOptions: { fromServer: true }.

Если вы используете старую версию jqGrid, вы можете использовать обратный вызов beforeRefresh для сброса datatype до "json" непосредственно перед перезагрузкой. Сам Struts2 не использую. Так что я не знаю, где можно указать обратный вызов beforeRefresh

В качестве альтернативы вы можете использовать navigatorRefresh="false", чтобы удалить стандартную кнопку «Обновить» из панели навигации и использовать navigatorExtraButtons, которая, похоже, заменяет navButtonAdd. Если я правильно понял вариант, то можно указать бесплатный код onclick, который сделает все, что вам нужно. Вы можете использовать icon: "ui-icon-refresh", чтобы пользовательская кнопка выглядела точно так же, как стандартная кнопка «Обновить». Внутри onclick вы можете установить datatype: 'json' и запустить "reloadGrid".

person Oleg    schedule 19.06.2015
comment
Плагин Struts2 использует jqGrid 4.6.0, поэтому я не могу использовать эту новую опцию. Но ваше предложение для старой версии сработало отлично. Еще раз спасибо. Есть ли способ применить существующий локальный фильтр/сортировку после вызова .trigger(reloadGrid)? - person user3420328; 19.06.2015
comment
@ user3420328: Я не уверен, как вы можете сделать это в Struts2, но в общем случае вам нужно сохранить postData.filters перед перезагрузкой, установить datatype: 'json', запустить reloadGrid, затем вам нужно включить loadComplete с помощью маленький код var $self = $(this), p = $self.jqGrid("getGridParam"); if (p.datatype === "json") { setTimeout(function () { p.postData.filters = previouslySavedFilter; p.search = true; $self.trigger("reloadGrid"); }, 50);} Код из setTimeout будет выполнен после того, как jqGrid уже изменил datatype на "local" и перезагрузка с фильтром будет локальной. - person Oleg; 19.06.2015
comment
Кажется, я не могу заставить этот код работать. Я не знаком с javascript, поэтому не знаю, как сохранить postData.Filters? Можете ли вы привести пример этого процесса? - person user3420328; 22.06.2015
comment
@ user3420328: Извините, но у меня нет примеров, которые делают именно то, что вам нужно. Сохранение — это не что иное, как присвоение значения переменной: previouslySavedFilter = p.postData.filters;. Если у вас нет проблем с использованием параметров сетки, то вы можете p.previouslySavedFilter = p.postData.filters;. Я имею в виду, что previouslySavedFilter, где вы сохраняете данные и восстанавливаете их позже, может быть просто новым параметром jqGrid. Если у вас возникнут проблемы с реализацией, вы должны открыть новый вопрос и опубликовать ваш текущий код, который работает не так, как ожидалось, и я помогу вам это исправить. - person Oleg; 22.06.2015
comment
Спасибо, я создал следующий вопрос о сохранении фильтра postData. stackoverflow.com/questions/30984263/ - person user3420328; 22.06.2015