【问题标题】:How can I load up my grid with filters already applied?如何加载已应用过滤器的网格?
【发布时间】:2016-02-18 12:41:21
【问题描述】:

我有一个 jqGrid,我希望能够加载已经应用的过滤器(可能会通过 URL 传递)。为了测试,我对过滤器进行了硬编码,但我无法让它工作。我正在尝试遵循here 的答案以使其正常工作。

我的网格代码(为简单起见删除了一些列):

<script type="text/javascript">
$(function(){
    $("#users").jqGrid({
            datatype: 'json',
            url: 'myLoadURL',
            gridview: true,
            loadonce: true,
            colModel: [ 
                {name: 'lastname', label: 'Last Name'},
                {name: 'firstname', label: 'First Name'},
                {name: 'email', label: 'Email'}
              ],
            height:'auto',
            autowidth:true,
            caption:'Users',
            rowNum:20,
            rowList:[10,20,50],
            ignoreCase: true, // case-insensitive filtering
            pager: '#pager',
            postData: {
                filters: '{"groupOp":"AND",rules:[{"field":"lastname", "op":"cn", "data":"smith"},{"field":"firstname","op":"cn","data":"john"}]}' 
            },
            search:true
        });
    $("#users").jqGrid("filterToolbar", {searchOnEnter: false});
});
</script>

<table id="users"><tr><td></td></tr></table> 
<div id="pager"></div> 

在这种情况下,我试图过滤名字包含“John”和姓包含“Smith”的用户。但是,所有记录都已加载。如何获取要应用的初始过滤器值?

【问题讨论】:

  • 您是否在服务器代码 (myLoadURL) 中实现了服务器端过滤?是否要加载服务器上已经过滤的数据,然后使用`loadonce: true`设置其他过滤器并进行本地排序、分页和过滤?网格中总共会返回多少行(100、1000、10000、1000000)?
  • @Oleg - 没有服务器端过滤,我使用的是loadonce:true。所有的过滤/排序/分页都在前端完成。网格包含大约 16,000 行。我正在尝试确定是否有办法在数据全部加载到网格中之前应用过滤器。

标签: jquery filter jqgrid


【解决方案1】:

您有两种主要的方式来应用 本地 过滤器:

  • 设置过滤器 (postData.filters) 和选项 search: true 并在第一次从服务器加载数据后直接重新加载 jqGrid。
  • 使用单独的jQuery.ajax 调用从服务器加载数据并使用datatype: "local", data: dataReturnedFromServer, search: true, postData: {filters: ...} 创建网格。

网格中的总行数 16,000 相对较大,但如果您使用现代 Web 浏览器和最新版本的 jqGrid(例如 free jqGrid 4.10.0),它仍然可以足够快地显示出来。大量的列对于网格的性能也可能非常重要。

要遵循第一种方法,可以在网格中包含以下loadComplete 回调:

loadComplete: function () {
    var $this = $(this), p = $this.jqGrid("getGridParam");
    if (p.datatype === "json") {
        // we are loading the data from the server.
        // we should allow jqGrid to process loadComplete
        // till the end, change datatype to "local" and
        // only after that we should reload the grid once more
        // using locally sorted and filterd data
        setTimeout(function () {
            p.search = true;
            p.postData.filters = '{"groupOp":"AND",rules:[{"field":"lastname", "op":"cn", "data":"smith"},{"field":"firstname","op":"cn","data":"john"}]}';
            $this.triggerHandler("reloadGrid");
        }, 50);
    }
}

您可以通过最初使用rowNum:1 并在重新加载之前设置p.rowNum = 20; 来提高一点性能。第一种方法的唯一缺点是网格内容的轻弹。

【讨论】:

  • 谢谢!我添加了您的 loadComplete 回调代码,它确实有效。 2个问题:1)它实际上加载了整个网格,然后应用了过滤器。我更喜欢在加载结果之前应用过滤器,并且 2)它实际上并没有显示在过滤器输入中应用的过滤器。 (这可能不是问题,但如果我们希望它显示,我们将如何实现呢?)
  • (询问是因为如果事实证明在显示结果之前无法轻松过滤,我们可能只是将过滤/分页/排序移动到DB端而不是使用loadonce,因为它目前加载所有记录的网格需要 15 秒。)
  • @froadie:实现 服务器端过滤 可能是 16000 行数据的不错选择。要在过滤器工具栏中应用来自postData.filters 的过滤器,您可以使用我在the old answer 中发布的refreshSerchingToolbar 方法。请参阅one more answer 了解更多重新发送的代码。重要的是不要忘记,只有在filterToolbar创建了搜索工具栏后,您才能刷新过滤器工具栏(在工具栏中填充数据)。
  • 谢谢,这将解决我的第二个问题(虽然功能看起来很复杂)。第一个更关键的问题是什么——如何在加载结果之前应用过滤器?
  • @froadie:对不起,我不明白你的意思。 “在加载结果之前应用过滤器 仅表示数据的服务器端过滤,因为 jqGrid 加载与 jQuery.ajax 调用相关的数据。 “加载前”只能在服务器端进行。因此,您的服务器代码应该测试_search=truefilters 参数并返回填充对应filters的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2013-12-28
相关资源
最近更新 更多