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

Jquery 如何实现jqGrid树的服务器端排序?,jquery,jqgrid,treegrid,Jquery,Jqgrid,Treegrid,我使用jqGrid v4.5.4(免费版)实现了树形网格(treeGrid:true和treeGridModel:“邻接”),一切都很好地工作 现在,我只想在子节点上实现服务器端排序,但从中,我了解到排序总是在客户端上本地完成 对于这种行为是否有任何解决方法,并向服务器请求排序,并使用来自服务器的排序数据重新加载整个treeGrid 提前谢谢 如果最初加载数据,则子节点将按从服务器返回的相同顺序包含。我可以建议您在折叠节点时实现移除子节点。您的主要问题是使用retro版本4.5.4。如果您想更新

我使用jqGrid v4.5.4(免费版)实现了树形网格(
treeGrid:true
treeGridModel:“邻接”
),一切都很好地工作

现在,我只想在子节点上实现服务器端排序,但从中,我了解到排序总是在客户端上本地完成

对于这种行为是否有任何解决方法,并向服务器请求排序,并使用来自服务器的排序数据重新加载整个treeGrid


提前谢谢

如果最初加载数据,则子节点将按从服务器返回的相同顺序包含。我可以建议您在折叠节点时实现移除子节点。您的主要问题是使用retro版本4.5.4。如果您想更新到免费的jqGrid 4.13.5,那么您可以通过包含
unloadNodeOnCollapse:true
选项来解决您的问题。折叠父节点时,它将自动删除所有子节点。我们甚至可以通过使用回调函数实现更复杂的场景,该函数返回布尔值,而不是使用
unloadNodeOnCollapse:true
选项。演示如何执行此操作

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


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

如果最初加载数据,则子节点将按从服务器返回的相同顺序包含。我可以建议您在折叠节点时实现移除子节点。您的主要问题是使用retro版本4.5.4。如果您想更新到免费的jqGrid 4.13.5,那么您可以通过包含
unloadNodeOnCollapse:true
选项来解决您的问题。折叠父节点时,它将自动删除所有子节点。我们甚至可以通过使用回调函数实现更复杂的场景,该函数返回布尔值,而不是使用
unloadNodeOnCollapse:true
选项。演示如何执行此操作

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


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

基于@Oleg的输入,这就是我在jqGrid中为树实现服务器端排序所做的

onSortCol
事件在单击可排序列后立即引发,详细信息请参见)

onSortCol:函数(索引、iCol、排序器){ $('#'+gridId).jqGrid('setGridParam',{postData:formData}).trigger('reloadGrid'); 返回'stop';//停止排序处理
}

基于@Oleg的输入,这就是我在jqGrid中为树实现服务器端排序所做的

onSortCol
事件在单击可排序列后立即引发,详细信息请参见)

onSortCol:函数(索引、iCol、排序器){ $('#'+gridId).jqGrid('setGridParam',{postData:formData}).trigger('reloadGrid'); 返回'stop';//停止排序处理
}

非常感谢@Oleg的快速回复。一段时间以来,我们一直在考虑升级jqGrid库。虽然我不确定它是否能解决服务器端排序问题,因为我希望在子节点上有一个类似于常规jqGrid的行为,即单击列标题,并且在应用排序时(单击列标题),树可以扩展所有根节点。@Deb\uz:是否一次加载所有节点的子注释?您当前的需求意味着按照新的排序顺序从服务器重新加载当前加载的节点。这使得与服务器的接口更加复杂。我不知道你为什么要在服务器端排序?您可以以任何方式自定义客户端排序。是的,我一次加载所有带有子节点的节点。我们的假设是,我们一开始不会有太多的记录(@Deb_979;:我很难理解您的问题,因为您没有发布任何代码或任何测试数据。您能解释一下为什么不想在客户端对数据进行排序吗?在本地排序期间,jqGrid使用
sorttype
sortfunc
,您可以将其定义为回调函数并实现