free-jqgrid: более простой способ сохранять, загружать и применять данные фильтра, включая текст панели инструментов фильтра и параметры страницы?
У меня довольно стандартный jqGrid
с помощью free-jqGrid 4.13
с loadonce: true;
То, что я хочу сделать, это то, с чем я сталкивался пару раз:
Я хочу сохранить состояние сетки (без данных);
это означает настройки (например, номер текущей страницы), фильтры, примененные пользователем, а также текст на панели инструментов фильтра.
а затем загрузить и применить эти данные к сетке позже.
jqGrid - такой мощный инструмент, но такие вещи кажутся такими сложными.
после нескольких часов работы я придумал сложное решение; это работает, но это не очень хорошее решение imho:
1) сохранение данных фильтра jqGrid (локально):
// in this example i am using the "window unload" event,
// because i want the filters to be saved once you leave the page:
$(window).on("unload", function(){
// i have to access the colModel in order to get the names of my columns
// which i need to get the values of the filter-toolbar textboxes later:
var col_arr = $("#list").jqGrid("getGridParam", "colModel");
// my own array to save the toolbar data:
var toolbar_search_array = [];
for(var i = 0, max = col_arr.length; i < max; i++)
{
// only saving the data when colModel's "search" is set to true
// and value of the filterToolbar textbox got a length
// the ID of the filterToolbar text-input is "gs_" + colModel.name
if(col_arr[i].search && $("#gs_" + col_arr[i].name).val().length)
{
toolbar_search_array.push({ name: col_arr[i].name, value: $("#gs_" + col_arr[i].name).val() });
}
}
// putting everything into one object
var pref = {
// 1. toolbar filter data - used to fill out the text-inputs accordingly
toolbar : toolbar_search_array,
// 2. postData - contains data for the actual filtering
post : $("#list").jqGrid("getGridParam", "postData"),
// 3. settings - this data is also included in postData - but doesn't get applied
// when using 'setGridParam'
sortname: $('#list').jqGrid('getGridParam', 'sortname'),
sortorder: $('#list').jqGrid('getGridParam', 'sortorder'),
page: $('#list').jqGrid('getGridParam', 'page'),
rowNum: $('#list').jqGrid('getGridParam', 'rowNum')
};
//saving in localStorage
localStorage.setItem("list", JSON.stringify( pref ));
});
2) загрузка и применение jqGrid filter-data:
для использования, например, в закрытом документе
var localsave = JSON.parse(localStorage.getItem("list"));
// these settings are also saved in postData,
// but they don't get applied to the grid when setting the postData:
$('#list').jqGrid('setGridParam', {
sortname: localsave.sortname,
sortorder: localsave.sortorder,
page: localsave.page,
rowNum: localsave.rowNum
});
// this applies the filtering itself and reloads the grid.
// it's important that you don't forget the "search : true" part:
$("#list").jqGrid("setGridParam", {
search : true,
postData : localsave.post
}).trigger("reloadGrid");
// this is loading the text into the filterToolbar
// from the array of objects i created:
console.log(localsave.toolbar);
for(i = 0, max = localsave.toolbar.length; i < max; i++)
{
$("#gs_" + localsave.toolbar[i].name).val( localsave.toolbar[i].value );
}
мне кажется странным, что postData
содержит все необходимые данные, но невозможно применить эти данные; по крайней мере, насколько я знаю.
мои вопросы):
действительно ли это неудобно применять все данные фильтра и подкачки или я что-то упустил?
почему это не может быть так просто, как:
// saving:
var my_save = $("#list").jqGrid("getGridParam", "postData");
// loading:
$("#list").jqGrid("setGridParam", {
search : true,
postData : my_save
}).trigger("reloadGrid");
?
спасибо за любую помощь и / или предложения!
1 ответ
Ответ с демоверсией дает пример реализации. Метод refreshSerchingToolbar
относительно долго. С другой стороны код все еще не полный. Это не восстановить состояние операндов, если опция searchOperators: true
используется. Я хотел переписать многие части filterToolbar
способ облегчить сохранение / восстановление состояния панели инструментов фильтра или обновление на основе измененных postData
, Это просто проблема времени и ничего более. То, что вы описываете, близко к функции forceClientSorting: true
Это было трудно реализовать в оригинальном коде jqGrid 4.7, но это было легко реализовать после того, как я переписал большую часть обработки ответа сервера. Та же проблема с кодом filterToolbar
, Изменения filterToolbar
все еще в моем списке TODO, и я скоро внесу соответствующие изменения.