如何过滤 jqGrid 数据而不是网格本身
How to filter jqGrid data but not the grid itself
据我所知,free-jqgrid uses 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
查询。
是否有任何 public 函数可以获取 grid
的当前查询?
我还看到有私人的可能性以 sql
格式获得它。
我想尽可能多地使用默认 jqGrid
功能,但没有找到任何东西。任何提示表示赞赏。
更新 2:
这是 fiddle 当前的实现。我需要采用它,所以那里有一些丑陋的部分,但你可以过滤价值观,以了解这个想法。首先,玩一下网格,因为代码很糟糕(这就是我想要更改它的原因,真的:))
所以,主要思想:
我们将过滤器值修改为众所周知的rules
和groups
。
我们遍历所有列,删除此列名称的 rules
和 groups
并过滤数据。我的问题部分来了:我需要过滤数据,而不是网格,只需要一个数据来获得唯一值。现在我从 postData
生成一个正则表达式,并通过 javascript
生成子集网格数据。您可以在 getDistinctColumnValues
和 中看到这一点我想使用一些网格过滤可能性 使其工作方式与我们制作 [= 时所有 opts
的工作方式相同56=] 设置了 postData
。
此外,我还看到了一些内部函数来获取过滤器作为 sql
-where - 这对于后端原型设计也很好。
抱歉,我不确定您需要实施什么。您可以获得 lastSelectedData
参数以根据当前过滤器获取过滤和排序数据的数组。完整数据可通过 lastSelectedData
参数获得。 postData
参数的 filters
属性 为您提供当前过滤器。
你问了"are there any public functions to get current query for grid?"。您可以使用 getGridParam
方法获取当前查询。我想,您想访问一些接近 jlinq 的内部结构,但它实际上没有任何实用价值。您可以通过 $.jgrid.from
访问 class,但这并不是很有用。实用的只需要在 postData.filters
参数中设置新的过滤器,将 search
参数设置为 true
并调用 .trigger("reloadGrid")
以使用新数据重新加载网格。
如果您需要自己过滤或排序一些数据,那么数组方法filter
和sort
会更有效。如果以上信息不能帮助您解决问题,请在您的问题后附上附加信息,这些信息通过示例和 post 我的小评论更详细地描述了问题。
已更新:我仍然不确定我是否完全理解您想要实现的内容。在我看来,如果您使用一些免费的 jqGrid 选项,您的 JSFiddle 演示的大部分功能都可以删除。
看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 支持 generateValue: true
属性 of searchoptions
用于具有 stype: 'select'
的列(参见 here). Internally it works like another option of colModel
: createColumnIndex: true
, which generates the map from unique values in all columns having createColumnIndex: true
. One can use getUniqueValueFromColumnIndex
method to get the index for any column (like var indexName = $("#list").jqGrid("getUniqueValueFromColumnIndex", "name");
). If one uses stype: 'select', searchoptions: { generateValue: true }
, then filterToolbar
build automatically <select>
elements using the index. jqGrid uses internally oSv = $("#list")[0].generateValueFromColumnIndex(cmName, sep, delim);
(see here)。因此,使用该功能可以节省大量自定义设置。
在使用 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 }
。 Datalists 在不同的 web 浏览器中以稍微不同的方式实现,它们有一些缺点,但它是 native 实现的功能,因此运行速度非常快。可以将它用于例如网格中的 1000 个唯一值和 10000 行(我强烈建议在这种情况下使用本地数据分页并使用页面大小 10-25)。具有 1000 个元素的数据列表仍然具有良好的性能,例如 select2 更好。
最后的评论。我看到您构建了 colModelIndexesByNames
以按名称查找列。内置参数 iColByName
已经存在于免费的 jqGrid 中并在内部使用。如果p
是对jqGrid(var p = $("#list").jqGrid("getGridParam")
)参数的引用,那么p.iColByName
就是映射,它通过列名获取列索引,p.colModel[p.iColByName.name]
代表[=中的项26=],对应 "name"
列。
据我所知,free-jqgrid uses 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
查询。
是否有任何 public 函数可以获取 grid
的当前查询?
我还看到有私人的可能性以 sql
格式获得它。
我想尽可能多地使用默认 jqGrid
功能,但没有找到任何东西。任何提示表示赞赏。
更新 2:
这是 fiddle 当前的实现。我需要采用它,所以那里有一些丑陋的部分,但你可以过滤价值观,以了解这个想法。首先,玩一下网格,因为代码很糟糕(这就是我想要更改它的原因,真的:))
所以,主要思想:
我们将过滤器值修改为众所周知的
rules
和groups
。我们遍历所有列,删除此列名称的
rules
和groups
并过滤数据。我的问题部分来了:我需要过滤数据,而不是网格,只需要一个数据来获得唯一值。现在我从postData
生成一个正则表达式,并通过javascript
生成子集网格数据。您可以在getDistinctColumnValues
和 中看到这一点我想使用一些网格过滤可能性 使其工作方式与我们制作 [= 时所有opts
的工作方式相同56=] 设置了postData
。
此外,我还看到了一些内部函数来获取过滤器作为 sql
-where - 这对于后端原型设计也很好。
抱歉,我不确定您需要实施什么。您可以获得 lastSelectedData
参数以根据当前过滤器获取过滤和排序数据的数组。完整数据可通过 lastSelectedData
参数获得。 postData
参数的 filters
属性 为您提供当前过滤器。
你问了"are there any public functions to get current query for grid?"。您可以使用 getGridParam
方法获取当前查询。我想,您想访问一些接近 jlinq 的内部结构,但它实际上没有任何实用价值。您可以通过 $.jgrid.from
访问 class,但这并不是很有用。实用的只需要在 postData.filters
参数中设置新的过滤器,将 search
参数设置为 true
并调用 .trigger("reloadGrid")
以使用新数据重新加载网格。
如果您需要自己过滤或排序一些数据,那么数组方法filter
和sort
会更有效。如果以上信息不能帮助您解决问题,请在您的问题后附上附加信息,这些信息通过示例和 post 我的小评论更详细地描述了问题。
已更新:我仍然不确定我是否完全理解您想要实现的内容。在我看来,如果您使用一些免费的 jqGrid 选项,您的 JSFiddle 演示的大部分功能都可以删除。
看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 支持 generateValue: true
属性 of searchoptions
用于具有 stype: 'select'
的列(参见 here). Internally it works like another option of colModel
: createColumnIndex: true
, which generates the map from unique values in all columns having createColumnIndex: true
. One can use getUniqueValueFromColumnIndex
method to get the index for any column (like var indexName = $("#list").jqGrid("getUniqueValueFromColumnIndex", "name");
). If one uses stype: 'select', searchoptions: { generateValue: true }
, then filterToolbar
build automatically <select>
elements using the index. jqGrid uses internally oSv = $("#list")[0].generateValueFromColumnIndex(cmName, sep, delim);
(see here)。因此,使用该功能可以节省大量自定义设置。
在使用 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 }
。 Datalists 在不同的 web 浏览器中以稍微不同的方式实现,它们有一些缺点,但它是 native 实现的功能,因此运行速度非常快。可以将它用于例如网格中的 1000 个唯一值和 10000 行(我强烈建议在这种情况下使用本地数据分页并使用页面大小 10-25)。具有 1000 个元素的数据列表仍然具有良好的性能,例如 select2 更好。
最后的评论。我看到您构建了 colModelIndexesByNames
以按名称查找列。内置参数 iColByName
已经存在于免费的 jqGrid 中并在内部使用。如果p
是对jqGrid(var p = $("#list").jqGrid("getGridParam")
)参数的引用,那么p.iColByName
就是映射,它通过列名获取列索引,p.colModel[p.iColByName.name]
代表[=中的项26=],对应 "name"
列。