【发布时间】:2015-06-22 15:43:30
【问题描述】:
我有一个 jqGrid,我在其中启用了本地过滤/排序功能。当我将数据类型设置为 JSON 后,单击调用 .trigger("reloadGrid") 的自定义刷新按钮时,我正在重新加载网格(从服务器)。重新加载成功,但是当列顶部的某个过滤器字段中有值时,它会丢失该值。
我尝试在将值设置为 JSON 之前保存 postData.filters,然后在重新加载后我尝试将新过滤器设置为保存的值,将数据设置为本地,然后重新加载网格。
这是我目前所拥有的:
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 is undefined”。如果我在重新加载后(在 loadComplete 中)打印 postData,那么我可以查看过滤器数据。
【问题讨论】:
-
refreshGrid会被调用吗?我不知道struts2。您可以在navigatorExtraButtons内部使用onclick:refreshGrid并将refreshGrid单独定义为一个函数吗? 您能否包括您当前的代码loadComplete? 无论如何,var p = $('#gridtable').jqGrid("getGridParam", "postData");行是错误的。应该是var p = $('#gridtable').jqGrid("getGridParam");。我建议你使用p.previouslySavedFilter = p.postData.filters -
@Oleg:我已经为 loadComplete 添加了代码。另外,我试过
p = $('#gridtable').jqGrid("getGridParam"),但它返回未定义,我可以使用("getGridParam","postData"),它返回{"groupOp":"AND","rules":[{"field":"taxIdNbr","op":"bw","data":"11365"}]} -
$('#gridtable').jqGrid("getGridParam", "postData")在refreshGrid和loadComplete中的值应该相同。为什么你在一种情况下有undefined。顺便说一句,bind在$.subscribe('loadComplete', ...中的使用是错误的。这意味着您对每个loadComplete进行新绑定。如果您按列排序或转到新页面,则将执行loadComplete并且您将 multiple 绑定到同一事件。这是不对的。您应该使用$.subscribe的绑定outside 移动代码。我现在得走了,明天继续, -
感谢您抽出时间奥列格。我现在已经开始工作了,我不需要设置任何过滤器信息,它已经存在于 postData 中,我只需要将数据设置为本地(在 loadComplete 内部,数据类型仍设置为 JSON)然后重新加载网格。我试图将我的一些绑定从 loadComplete 中移出,但是它们没有运行......我会继续努力的。再次感谢您的帮助。
-
不客气!顺便说一句,您可以删除
$("#gridtable").jqGrid("setGridParam", {datatype: 'local'});,因为 jqGrid 在调用loadComplete后直接执行此操作。您可以通过在setTimeout中添加alert($('#gridtable').jqGrid("getGridParam", "datatype"));来验证这一点。您在答案中发布的代码看起来像我最初发布的代码,可以减少它,因为postData.filters不会被清除。
标签: jquery jqgrid struts2-jquery-plugin struts2-jquery-grid