Jquery 如何使用已应用的过滤器加载网格?

Jquery 如何使用已应用的过滤器加载网格?,jquery,filter,jqgrid,Jquery,Filter,Jqgrid,我有一个jqGrid,我希望能够加载已经应用的过滤器(可能会通过URL传递)。为了测试,我正在对过滤器进行硬编码,但我无法让它工作。我正试着按照答案去做 我的网格代码(为了简单起见,删除了一些列): $(函数(){ $(“#用户”).jqGrid({ 数据类型:“json”, url:'myLoadURL', gridview:没错, 有一次:是的, colModel:[ {name:'lastname',label:'lastname'}, {name:'firstname',label:'

我有一个jqGrid,我希望能够加载已经应用的过滤器(可能会通过URL传递)。为了测试,我正在对过滤器进行硬编码,但我无法让它工作。我正试着按照答案去做

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


$(函数(){
$(“#用户”).jqGrid({
数据类型:“json”,
url:'myLoadURL',
gridview:没错,
有一次:是的,
colModel:[
{name:'lastname',label:'lastname'},
{name:'firstname',label:'firstname'},
{name:'email',label:'email'}
],
高度:'自动',
自动宽度:正确,
标题:"用户",,
rowNum:20,
行列表:[10,20,50],
ignoreCase:true,//不区分大小写的筛选
寻呼机:“#寻呼机”,
postData:{
筛选器:“{”groupOp:“AND”,规则:[{”field:“lastname”,“op:“cn”,“data:“smith”},{”field:“firstname”,“op:“cn”,“data:“john”}]}”
},
搜索:正确
});
$(“#users”).jqGrid(“filterToolbar”,{searchOneNet:false});
});

在本例中,我试图筛选firstname包含“John”和lastname包含“Smith”的用户。不过,所有记录都已加载。如何获取要应用的初始筛选值?

应用本地筛选有两种主要方法:

  • 设置过滤器(
    postData.filters
    )和选项
    search:true
    ,并在第一次从服务器加载数据后直接重新加载jqGrid
  • 使用单独的
    jQuery.ajax
    调用从服务器加载数据,并使用
    datatype:“local”、data:dataReturnedFromServer、search:true、postData:{filters:…}
    创建网格
网格中的总行数16000相对较大,但如果使用现代web浏览器和最新版本的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,可以稍微提高性能重新加载之前。第一种方法的唯一缺点是网格内容的小翻转。

您是否在服务器代码(
myLoadURL
)中实现了服务器端过滤?是否要加载已在服务器上筛选的数据,然后使用“loadonce:true”设置其他筛选器并执行本地排序、分页和筛选?网格中总共会返回多少行(10010001000000)?@Oleg-没有服务器端过滤,我使用的是
loadonce:true
。所有过滤/排序/分页都在前端完成。网格包含大约16000行。我正在尝试在数据全部加载到网格之前确定是否有方法应用过滤器。谢谢!我添加了你的loadComplete回调代码,它确实有效。2个问题:1)它实际加载整个网格,然后应用过滤器。我宁愿在加载结果之前应用过滤器,2)它实际上并不显示过滤器输入中应用的过滤器。(这可能不是一个问题,但如果我们想让它显示出来,我们将如何实现这一点?)(询问是因为如果在显示结果之前无法轻松过滤,我们可以将过滤/分页/排序移到数据库端,而不是使用
loadonce
,因为当前需要15秒才能将所有记录加载到网格。)@froadie:Implementation服务器端筛选可能是16000行数据的最佳选择。要从
postData应用筛选。筛选
在筛选工具栏中,您可以使用我发布的
refreshSerchingToolbar
方法。有关更多最新代码,请参阅。重要的是不要忘记您可以刷新筛选工具bar(填充工具栏中的数据)仅在通过
filterToolbar
创建seraching工具栏之后。谢谢,这将解决我的第二个问题(尽管功能似乎很复杂)。第一个更关键的问题是什么?我如何在加载结果之前应用过滤器?@froadie:对不起,我不明白你的意思。“在加载结果之前应用过滤器”只能意味着服务器端对数据进行过滤,因为jqGrid加载与jQuery.ajax调用相关的数据。“加载之前”只能在服务器端完成。因此,服务器代码应该测试
\u search=true
过滤器
参数,并返回与
过滤器
相对应的填充数据。
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);
    }
}