据我所见,自由jqgrid使用jlinq过滤和搜索数据。我正在制作我自己的过滤器,这些过滤器使用的是众所周知的格式的网格postData:
{ "groupOp": "AND",
"groups" : [
{ "groupOp": "OR",
"rules": [
{ "field": "name", "op": "eq", "data": "England" },
{ "field": "id", "op": "le", "data": "5"}
]
}
],
"rules": [
{ "field": "name", "op": "eq", "data": "Romania" },
{ "field": "id", "op": "le", "data": "1"}
]
}此数据在内部转换为jlinq查询。是否有任何公共函数来获取当前对grid的查询?我还看到了一种以sql-like格式获取它的私有可能性。
我想尽可能多地使用默认的jqGrid功能,但是没有找到任何东西。如有任何提示,将不胜感激。
更新2
下面是带有当前实现的小提琴。我需要采用它,所以有一些丑陋的地方,但你可以过滤价值观,以获得想法。首先,使用网格,因为代码很糟糕(这就是为什么我想改变它,真的:)
所以,主要想法是:
rules和groups.rules和groups,然后过滤数据。下面是我的问题部分:我需要过滤数据,而不是网格,只需要一个数据来获得唯一的值。现在,我通过普通的postData和子集网格数据生成一个正则表达式。您可以在getDistinctColumnValues和中看到这一点,我想使用一些网格过滤可能性,使其与使用postData集进行筛选/搜索时所有opts的工作方式相同。此外,我还看到了一些内部函数来获得过滤器作为一个sql-where -这也是最好的后端原型。
发布于 2019-09-02 19:41:58
对不起,但我不知道你需要实现什么。您可以获得lastSelectedData参数,以便根据当前筛选器对数据进行筛选和排序。完整的数据可以通过lastSelectedData参数获得。filters参数的postData属性将获得当前筛选器。
您问过“是否有任何公共功能来获取当前的网格查询?”可以使用getGridParam方法获取当前查询。我想,您想要访问一些接近jlinq的内部结构,但是它并没有实际的价值。您可以通过$.jgrid.from访问这个类,但这并没有多大帮助。实际应用中只需在postData.filters参数中设置新的过滤器,将search参数设置为true,并调用.trigger("reloadGrid")重新加载新数据。
如果您需要自己筛选或排序某些数据,那么数组方法filter和sort将更有效。如果上面的信息不能帮助您解决问题,请附加更多的信息,说明问题的更详细的例子,并给我一些小小的评论。
更新:我仍然不确定我是否确切地理解了您想要实现的内容。在我看来,如果您使用一些免费的JSFiddle选项,那么您的jqGrid演示的大部分功能都可以被删除。
看看https://jsfiddle.net/OlegKi/wqxyo579/25/,它使用
colModel: [
{ name: 'name' },
{ name: 'surname' },
{ name: 'age' },
],
cmTemplate: {
width: 100,
autoResizable: true,
stype: 'select',
searchoptions: {
generateValue: true,
noFilterText: "(All)"
}
},它在每个列上设置一些默认属性。从版本4.14.0开始,jqGrid支持具有stype: 'select'的列的searchoptions的generateValue: true属性(参见这里)。在内部,它的工作方式类似于colModel的另一个选项:createColumnIndex: true,它从所有具有createColumnIndex: true的列中的唯一值生成映射。可以使用getUniqueValueFromColumnIndex方法获取任何列的索引(如var indexName = $("#list").jqGrid("getUniqueValueFromColumnIndex", "name");)。如果使用stype: 'select', searchoptions: { generateValue: true },则filterToolbar使用索引自动生成<select>元素。jqGrid在内部使用oSv = $("#list")[0].generateValueFromColumnIndex(cmName, sep, delim); (参见这里)。因此,使用该特性可以节省大量的自定义。
在使用createColumnIndex: true或generateValue: true的情况下,唯一不应该忘记的事情是:索引将在数据加载或重新加载之后生成。因此,在filterToolbar填充数据之后,应该调用。如果您从服务器加载有关loadonce: true选项的数据,那么您应该更好地在loadCompleted回调中调用filterToolbar (如演示中所示)。在直接加载本地数据的情况下,不需要这样做。只需在填充数据后调用filterToolbar即可。
另一种选择是使用<datalist>而不是<select>。它允许在过滤器工具栏中使用<input>,但功能接近select或select2。参见https://jsfiddle.net/OlegKi/wqxyo579/24/,我在其中使用了createColumnIndex: true, searchoptions: { sopt: [ "cn", "eq", "bw", "ew", "bn", "nc", "en" ], clearSearch: true, generateDatalist: true }。数据工作者在不同的web浏览器中以不同的方式实现,他们也有一些缺点,但是它是本机实现特性,所以它工作得非常快。例如,可以在网格中使用它,例如1000个唯一值和10000行(我严格建议在这种情况下使用本地数据分页,并使用10-25页大小)。拥有1000个元素的数据工作者仍然有很好的性能,比如select2。
最后的评论。我看到您构建colModelIndexesByNames是为了按名称查找列。内置参数iColByName已经存在于免费的jqGrid中,并在内部使用。如果p引用jqGrid (var p = $("#list").jqGrid("getGridParam"))的参数,则p.iColByName是映射,它按列名获取列索引,p.colModel[p.iColByName.name]将在colModel中表示项,后者对应于"name"列。
https://stackoverflow.com/questions/57757202
复制相似问题