jqGrid:在页面重新加载时恢复过滤器(工具栏)值

时间:2014-07-09 15:31:20

标签: jquery jqgrid

(我确定这是一个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 );
   }
}

1 个答案:

答案 0 :(得分:2)

我在the answerthis 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 onethis one中所做的那样)。

如果您未在服务器端实施过滤,则过滤器将自动未应用。在您从服务器加载数据后,您可以关注the answer并重新加载网格一次。人们会看到闪烁,但排序和过滤器将被应用。