free-jqgrid:保存、加载和应用过滤器数据(包括过滤器工具栏文本和页面设置)的更简单方法?
free-jqgrid: easier way to save, load and apply filter data including filter-toolbar text and page-settings?
我有一个非常标准的 jqGrid
使用 free-jqGrid 4.13
和 loadonce: true;
我想做的是我遇到过几次的事情:
我想保存网格的状态(没有数据);
这意味着设置(例如当前页面的数量)、用户应用的过滤器以及过滤器工具栏中的文本。
然后稍后加载并将此数据应用到网格。
jqGrid 是一个非常强大的工具,但是像这样的东西似乎很难完成。
经过数小时的工作,我想出了一个复杂的解决方案;它正在工作,但这不是一个很好的解决方案恕我直言:
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 过滤器数据:
用于文档就绪的闭包,例如
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");
?
感谢您提供的任何帮助 and/or 建议!
with the demo 提供了一个实施示例。方法refreshSerchingToolbar
比较长。另一方面,代码仍然不完整。如果使用 searchOperators: true
选项,它不会恢复操作数的状态。我想重写 filterToolbar
方法的许多部分,使过滤器工具栏状态的 saving/restoring 或基于更改后的 postData
的刷新变得更容易。这只是时代的问题,仅此而已。你描述的是接近forceClientSorting: true
的特性,在jqGrid 4.7的原始代码中很难实现,但是在我重写了服务器响应的大部分处理后很容易实现。 filterToolbar
的代码也有同样的问题。 filterToolbar
的改动仍在我的TODO列表中,我会尽快做出相应的改动。
我有一个非常标准的 jqGrid
使用 free-jqGrid 4.13
和 loadonce: true;
我想做的是我遇到过几次的事情:
我想保存网格的状态(没有数据);
这意味着设置(例如当前页面的数量)、用户应用的过滤器以及过滤器工具栏中的文本。
然后稍后加载并将此数据应用到网格。
jqGrid 是一个非常强大的工具,但是像这样的东西似乎很难完成。
经过数小时的工作,我想出了一个复杂的解决方案;它正在工作,但这不是一个很好的解决方案恕我直言:
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 过滤器数据:
用于文档就绪的闭包,例如
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");
?
感谢您提供的任何帮助 and/or 建议!
refreshSerchingToolbar
比较长。另一方面,代码仍然不完整。如果使用 searchOperators: true
选项,它不会恢复操作数的状态。我想重写 filterToolbar
方法的许多部分,使过滤器工具栏状态的 saving/restoring 或基于更改后的 postData
的刷新变得更容易。这只是时代的问题,仅此而已。你描述的是接近forceClientSorting: true
的特性,在jqGrid 4.7的原始代码中很难实现,但是在我重写了服务器响应的大部分处理后很容易实现。 filterToolbar
的代码也有同样的问题。 filterToolbar
的改动仍在我的TODO列表中,我会尽快做出相应的改动。