请原谅我这样回答,但这个问题始于一个与过滤和分页相关但使用外部过滤源的主题。 Oleg 实际上有多个线程的演示,我可以使用它们来完成自定义过滤和维护默认的内置分页。所以他的答案将是原始问题主题的公认答案。
但是在原来的解决方案中,我遇到了另一个加载网格的问题。如果没有其他过滤器已经到位,我希望使用默认过滤值加载网格。那真的应该是一个不同的问题,因为它确实不影响第一个问题。
我发现另一个 Oleg 回复了一个完全不同的问题:
jqGrid - how to set grid to NOT load any data initially?。
Oleg 回答了这个问题,这个答案解决了我们第二个需要加载一种方式,然后允许另一种方式。
因此,在初始加载时,我们会在服务器端查找过滤器参数。没有给出?我们使用默认过滤提取记录。参数在场?我们使用初始提供的参数。与初始加载的区别是我们没有 AJAX 退出。我们改为 json_encode 数据并将其放置在网格定义中,如下所示:
$('#grd_invoices').jqGrid(
...
url: '{$modulelink}&sm=130',
data: {$json_encoded_griddata},
datatype: 'local',
...
});
由于数据类型设置为“本地”,网格最初不会转到服务器,因此网格使用数据参数。一旦我们准备好过滤,我们使用 Oleg 的解决方案从另一个问题的另一个答案中动态应用过滤器,如下所示:
var myfilter = { groupOp: 'AND', rules: []};
myfilter.rules.push({field:'fuserid',op:'eq',data:$('#fuserid').val()});
myfilter.rules.push({field:'finvoicenum',op:'eq',data:$('#finvoicenum').val()});
myfilter.rules.push({field:'fdatefield',op:'eq',data:$('#fdatefield').val()});
myfilter.rules.push({field:'fsdate',op:'eq',data:$('#fsdate').val()});
myfilter.rules.push({field:'fedate',op:'eq',data:$('#fedate').val()});
myfilter.rules.push({field:'fwithin',op:'eq',data:$('#fwithin').val()});
myfilter.rules.push({field:'fnotes',op:'eq',data:$('#fnotes').val()});
myfilter.rules.push({field:'fdescription',op:'eq',data:$('#fdescription').val()});
myfilter.rules.push({field:'fpaymentmethod',op:'eq',data:$('#fpaymentmethod').val()});
myfilter.rules.push({field:'fstatus',op:'eq',data:$('#fstatus').val()});
myfilter.rules.push({field:'ftotalfrom',op:'eq',data:$('#ftotalfrom').val()});
myfilter.rules.push({field:'ftotal',op:'eq',data:$('#ftotal').val()});
myfilter.rules.push({field:'fmake',op:'eq',data:$('#fmake').val()});
myfilter.rules.push({field:'fmodel',op:'eq',data:$('#fmodel').val()});
myfilter.rules.push({field:'fserial',op:'eq',data:$('#fserial').val()});
myfilter.rules.push({field:'fitemid',op:'eq',data:$('#fitemid').val()});
myfilter.rules.push({field:'ftaxid',op:'eq',data:$('#ftaxid').val()});
myfilter.rules.push({field:'fsalesrepid',op:'eq',data:$('#fsalesrepid').val()});
var grid = $('#grd_invoices');
grid[0].p.search = myfilter.rules.length>0;
$.extend(grid[0].p.postData,{filters:JSON.stringify(myfilter)});
$('#grd_invoices').jqGrid('setGridParam',{datatype:'json'}).trigger('reloadGrid',[{page:1}]);
这允许我们让网格显示本地加载的初始数据,然后随后的过滤将网格数据类型更改为“json”,这会强制网格使用新的过滤器参数进入服务器,在那里它会加载更具体的过滤。
这要归功于 Oleg,因为我使用了他许多问题中的许多帖子来得出最终结果。谢谢@Oleg!