(我确定这是一个UFU,但我似乎无法找到原因)
使用jqGrid显示数据。双击一行将打开一个包含深入信息的新页面。我想在单击“后退”按钮时恢复过滤条件。
过滤条件存储在grid.getGridParam( "postData" ).filters
的localStorage中。我试图在加载时恢复它,但没有得到值。
混淆因素可能是我在加载时通过为每列找到唯一值来创建filtertoolbar的值(请参阅here)。这说(对我来说)我不能在填充下拉列表之前设置过滤器值。为此我试图使用'loadComplete'函数(调用列表填充函数)。填充控件后,我正在调用grid.jqGrid( 'setGridParam', { 'postData' : localStorage[ "filter" ]});
。不幸的是,这似乎没有任何影响。
从我读过的一切来看,这是可行的。我错过了什么?
注意:我也尝试了this,但由于上面的'loadComplete'中设置了值,因此认为它无效。
编辑:过滤器值保存在此处:
ondblClickRow: function( rowid, iRow, iCol, e )
{
localStorage[ 'filter' ] = grid.getGridParam("postData").filters;
window.location = "info.php?idx=" + grid[0].p.data[ rowid - 1 ].IssueId;
}
从中保存 值。我测试页面重新加载的时间(并使用console.log()
)
loadonce 绝对是 true 。
以下是我使用的参数:
url: "loadIssues.php",
datatype: "json",
colNames: [ (list of values) ],
colModel: [ (array of values) ],
pager: "#pager2",
viewrecords: true,
sortorder: "desc",
gridview: true,
autoencode: true,
ignoreCase : true,
loadonce : true,
width: 800,
height: "auto",
shrinkToFit: true,
search: true,
jsonReader: {
repeatitems: false,
root: "rows"
},
编辑:
这是修复:使用$(this)是我的错误。使用对网格控件的引用替换它可以解决问题。
以下是我在loadComplete
中使用的代码:
loadComplete: function( data )
{
setSearchSelect( <column name> );
if( localStorage.hasOwnProperty( 'filter' ))
{
postData = $( "#list2" ).jqGrid( "getGridParam", "postData" );
paramNames = $( "#list2" ).jqGrid("getGridParam", "prmNames");
postData.filters = JSON.parse( localStorage[ 'filter' ]);
postData[paramNames.search] = true;
localStorage.removeItem( 'filter' );
setTimeout( function()
{
$( "#list2" ).trigger( "reloadGrid" );
}, 100 );
}
}
答案 0 :(得分:2)
我在the answer和this one中回答了如何保存localStorage
中的偏好设置,并在加载网格时将其恢复。
首先,我要提一下,在代码中使用localStorage["filter"]
会产生一些冲突。每个域和子域都有自己独立的本地存储区域,但您可以在Web服务器的不同页面上使用不同的网格。有些页面可能有更多的网格。因此,最好将另一个规则"filter"
用作localStorage
属性的名称。我在the answer中使用了将从window.location.pathname
和网格ID构建的属性名称。
现在我回到你的主要问题。我看到你必须解决的两个主要问题:
我在the answer中描述的第二部分的可能解决方案(参见refreshSerchingToolbar
内部调用的loadComplete
函数的代码)。我在the answer中使用了相同的方法,我使用localStorage
来保持用户对jqGrid的偏好。
jqGrid中过滤器的设置可以用不同的方式实现。在使用datatype: "json", loadonce: true
的情况下,指定要使用的行为非常重要。如果您实施了服务器端过滤,则可以在beforeRequest
回调中设置过滤器:
var storageName = "filters"; // or some better value
...
datatype: "json",
loadonce: true,
beforeRequest: function () {
var $self = $(this),
postData = $self.jqGrid("getGridParam", "postData"),
filters = postData.filters,
paramNames = $self.jqGrid("getGridParam", "prmNames"),
dataType = $self.jqGrid("getGridParam", "datatype"),
lastFilter = localStorage[storageName];
// one can add in the below condition testing of dataType === "json" if one need to set
// the filter on loading the data from the server only
if ((filters === null || filters === "" || filters === undefined) && lastFilter !== undefined) {
// current filter is not set, but it exists in localStorage
// we need to applay it
postData.filters = lastFilter;
// set _search parameter to true
postData[paramNames.search] = true;
}
return true;
},
loadComplete: function () {
var filters = $(this).jqGrid("getGridParam", "postData").filters;
if (filters !== null && filters !== "" && filters !== undefined) {
localStorage[storageName] = filters;
}
}
或者,您可以设置过滤器之前创建网格,就像我在已经引用的答案(this one和this one中所做的那样)。
如果您未在服务器端实施过滤,则过滤器将自动未应用。在您从服务器加载数据后,您可以关注the answer并重新加载网格一次。人们会看到闪烁,但排序和过滤器将被应用。