Jquery 如何使用已应用的过滤器加载网格?
我有一个jqGrid,我希望能够加载已经应用的过滤器(可能会通过URL传递)。为了测试,我正在对过滤器进行硬编码,但我无法让它工作。我正试着按照答案去做 我的网格代码(为了简单起见,删除了一些列):Jquery 如何使用已应用的过滤器加载网格?,jquery,filter,jqgrid,Jquery,Filter,Jqgrid,我有一个jqGrid,我希望能够加载已经应用的过滤器(可能会通过URL传递)。为了测试,我正在对过滤器进行硬编码,但我无法让它工作。我正试着按照答案去做 我的网格代码(为了简单起见,删除了一些列): $(函数(){ $(“#用户”).jqGrid({ 数据类型:“json”, url:'myLoadURL', gridview:没错, 有一次:是的, colModel:[ {name:'lastname',label:'lastname'}, {name:'firstname',label:'
$(函数(){
$(“#用户”).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
,并在第一次从服务器加载数据后直接重新加载jqGridsearch:true
- 使用单独的
调用从服务器加载数据,并使用jQuery.ajax
创建网格datatype:“local”、data:dataReturnedFromServer、search:true、postData:{filters:…}
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);
}
}