如何过滤 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 当前的实现。我需要采用它,所以那里有一些丑陋的部分,但你可以过滤价值观,以了解这个想法。首先,玩一下网格,因为代码很糟糕(这就是我想要更改它的原因,真的:))

所以,主要思想:

  1. 我们将过滤器值修改为众所周知的rulesgroups

  2. 我们遍历所有列,删除此列名称的 rulesgroups 并过滤数据。我的问题部分来了:我需要过滤数据,而不是网格,只需要一个数据来获得唯一值。现在我从 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") 以使用新数据重新加载网格。

如果您需要自己过滤或排序一些数据,那么数组方法filtersort会更有效。如果以上信息不能帮助您解决问题,请在您的问题后附上附加信息,这些信息通过示例和 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: truegenerateValue: 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" 列。