如何为 jqGrid 树实现服务器端排序?

How to implement server side sorting for jqGrid tree?

我使用 jqGrid v4.5.4(免费版)实现树状网格(treeGrid:truetreeGridModel:'adjacency')并且一切正常。

现在我只想在子节点上实现服务器端排序,但是从 this question 开始,我了解到排序总是在 treeGrid 的客户端本地完成。

是否有任何解决此行为的方法并发出服务器请求进行排序并使用来自服务器的已排序数据重新加载整个 treeGrid?

提前致谢!

如果数据最初加载,则子节点将按照与从服务器返回的顺序相同的顺序包含在内。我可以建议您在折叠节点时实现删除子节点。您的主要问题是复古版本 4.5.4 的使用。如果您要更新到免费的 jqGrid 4.13.5,那么您可以通过包含 unloadNodeOnCollapse: true 选项来解决您的问题。它会在父节点折叠时自动删除所有子节点。甚至可以通过使用 returns 布尔值回调函数而不是使用 unloadNodeOnCollapse: true 选项来实现更复杂的场景。 The demo 展示了您是如何做到这一点的。

复古版本的使用使问题更加复杂。您甚至不能使用在折叠节点时调用的 afterCollapseNodebeforeCollapseNode 回调,因为回调未在 jqGrid 4.5.4 中实现。唯一的解决方法是 subclassing collapseNode 方法。可以按照the old answer实现子类化。您可以先调用原始方法,然后再调用 delTreeNode,但要小心,因为该方法也会删除折叠节点(delTreeNode 没有第二个选项只允许删除子节点)。因此,您必须保存折叠节点并在调用 delTreeNode 后直接添加它,或者您可以调用 getFullTreeNode 然后在循环中调用 delRowData 跳过折叠节点。

可以看出,在复古版本jqGrid 4.5.4中实现需求并不简单。因此,我建议您考虑更新到当前版本的免费 jqGrid。您将免费获得额外的性能优势。

根据@Oleg 的输入,这就是我在 jqGrid 中实现树的服务器端排序的方法

(onSortCol 单击可排序列后立即引发事件,更多内容在 this event here)

onSortCol: function (index, iCol, sortOrder) { $('#'+gridId).jqGrid('setGridParam', {postData:formData}).trigger('reloadGrid'); return 'stop'; //stops the sort processing }