0

У меня есть jqGrid, где включена функция локального фильтра/сортировки. Я перезагружаю сетку (с сервера), когда щелкнула пользовательская кнопка обновления, которая вызывает .trigger («reloadGrid») после того, как я установил тип данных в JSON. Перезагрузка прошла успешно, однако, когда в одном из полей фильтра в верхней части столбца есть значение, оно теряет это значение.jqGrid Обновить значения фильтра После .trigger («reloadGrid»)

Я пытаюсь сохранить postData.filters перед установкой значения в JSON, после перезагрузки я пытаюсь установить новые фильтры на сохраненное значение, установите данные на локальные, а затем перезагрузите сетку.

Вот то, что я до сих пор:

var previouslySavedFilter; 
var p;  

$.subscribe('loadComplete', function(event, data) { 
    //Set Grid Attributes 
    $("#gridtable").jqGrid('setGridParam', { 
     ignoreCase : true 
    }); 

    //Bind events to refresh grid 
    $("#gridtable").bind("jqGridAddEditAfterSubmit", function() { 
     $(this).jqGrid("setGridParam", {datatype: 'json'}); 
      return [true]; 
    }); 

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

    //Set Up to Apply Local Filters 
    var p = $('#gridtable').jqGrid("getGridParam", "postData"); 
    var dtype = $('#gridtable').jqGrid("getGridParam", "datatype"); 

    if (dtype === "json") { 
     setTimeout(function() { 
      console.log("Value of p on loadComplete: " + JSON.stringify(p.filters)); 
      console.log("Value of previouslySavedData on loadComplete: " + JSON.stringify(previouslySavedFilter)); 

      p.filters = previouslySavedFilter; 
      p.search = true; 
      $("gridtable").trigger("reloadGrid"); 
      alert("Hey"); 
     }, 
     50); 
    }; 
} 

function refreshGrid(){ 
    var p = $('#gridtable').jqGrid("getGridParam", "postData"); 
    console.log("Value of P in reFreshGrid: " + JSON.stringify(p)); 
    previouslySavedFilter = p.postData.filters; 

    $("#gridtable").jqGrid("setGridParam", {datatype: 'json'}); 
    $("#gridtable").trigger("reloadGrid"); 
} 


<sjg:grid 
    id="gridtable" 
    navigatorExtraButtons="{ 
    refresh:{ 
     title:'Refresh', 
     icon:'ui-icon-refresh', 
     onclick:refreshGrid 
    } 
    ... 
> 

Я не знаю, как сохранить фильтры ДО Я установить тип данных в формате JSON и перезагрузить сетку. В приведенном выше коде отображается «p undefined» в консоли. Если я распечатаю postData ПОСЛЕ перезагрузки (в loadComplete), я могу просмотреть данные фильтра.

+0

Вызывается ли 'refreshGrid' вообще? Я не знаю struts2. Вы можете использовать 'onclick: refreshGrid' внутри' navigatorExtraButtons' и определить 'refreshGrid' отдельно как функцию? ** Не могли бы вы включить свой текущий код 'loadComplete'? ** В любом случае строка' var p = $ ('# gridtable'). JqGrid ("getGridParam", "postData"); 'неверно. Это должно быть 'var p = $ ('# gridtable'). JqGrid (" getGridParam ");'. Я рекомендую вам использовать 'p.previouslySavedFilter = p.postData.filters' – Oleg

+0

@Oleg: я добавил код для loadComplete. Кроме того, я попробовал 'p = $ ('# gridtable'). JqGrid (" getGridParam ")', но он возвращает undefined, я могу использовать '(" getGridParam "," postData ")' и он возвращает '{" groupOp ": «AND», «rules»: [{«field»: «taxIdNbr», «op»: «bw», «data»: «11365»}]} ' – user3420328

+0

Значение' $ ('# gridtable'). JqGrid («getGridParam», «postData») 'в' refreshGrid' и в 'loadComplete' должно быть ** одинаковым **. Почему у вас в одном случае 'undefined'. Кстати, использование 'bind' внутри' .subscribe ('loadComplete', ... '** неверно **. Это означает, что вы делаете ** новое связывание ** на каждом' loadComplete'. Если вы сортировать по столбцу или перейти на новую страницу, тогда будет выполняться 'loadComplete', и у вас будет ** множественная ** привязка к тому же событию. Это неправильно. Вы должны переместить код с привязками * вне *' .subscribe'. Мне нужно уйти сейчас и продолжить завтра, – Oleg

ответ

0

Ниже приведен код, который заставит сетку перезагрузить, используя информацию сортировки/фильтрации. Этот код идет в конце loadComplete(). Установка типа данных в локальный, а затем запуск перезагрузки - это ключ к тому, чтобы сетка применяла сортировку/фильтр к сетке (перезагрузка, когда данные установлены на «json», которые будут перезагружать сетку с сервера.)

var dtype = $('#gridtable').jqGrid("getGridParam", "datatype"); 

if (dtype == 'json'){ 
    $("#gridtable").jqGrid("setGridParam", {datatype: 'local'});  
    setTimeout(function() { 
     p.search = true; 
     $("#gridtable").trigger("reloadGrid"); 
     },0 
    ); 
} 
Смежные вопросы