jqGrid Treegrid在动态加载数据后不展开和折叠行

jqGrid Treegrid does not expand and collapse rows after dynamic load of data

本文关键字:折叠 Treegrid 动态 加载 数据 jqGrid      更新时间:2023-09-26

我有一个大的物料清单(BOM),我已经加载到jqGrid Treegrid中。它大约有500行。由于各种原因,我试图将数据块保持在64K以下,因此在较大的bom上,我不会加载最深的叶子,例如任何深度超过6级的叶子。当用户选择展开一个节点时,我想动态地加载这些,因为这个节点开始时因为没有加载而崩溃。大多数事情都按预期进行。用户可以折叠和展开已加载的任何节点。但是,当用户单击以展开缺少子节点的节点时,服务器将返回它的所有子节点,并在树网格中正确显示。如果这些子节点中的任何一个有折叠的节点,用户可以将它们展开,以此类推到分支的末端。但正常的行为到此为止了。一旦用户单击以展开缺少子节点的任何节点,则只有包含在最近的服务器响应中的节点才能展开。没有什么可以坍塌。报告的错误是:

An unexpected error has occurred: 
 'Unable to get property 'isleaf' of undefined or null reference'
 The url is ''
 The line number is 92

行号所指向的源文件是grid. tregrid .js

下面是一个扩展缺少子节点的小节点的响应示例。

{"page":"1", 
 "total":"1", 
 "records":"3", 
 "rows":[
     {"id":"491","hide":false,"cell":["491","M-065934-1","BRACKET","M","1","1",".00","","$.00","478","7","false","false"]},
     {"id":"492","hide":false,"cell":["492","M-065934-2","COLLAR","M","1","1",".00","","$.00","478","7","false","true"]},
     {"id":"493","hide":false,"cell":["493","PD M6 X 20","PIN,DOWEL","P","2","2",".00","","$.00","478","7","false","true"]}
 ]}

每行的最后四个值分别是parent、level、expanded和isleaf。在本例中,一旦加载了数据,只有行491是可扩展的,而这三行周围的行(包括父行478)都是不可折叠的。我需要看什么来确定问题?加载有影响吗?我没有手动设置加载在任何一行。当我加载网格时,我知道哪些行已经卸载了子行。我需要手动设置该值吗?

jqGrid (free): 4.4.3
jQuery: 1.9.0
jQuery UI: 1.8.23

编辑:我已经升级到以下版本:jqGrid (free): 4.11.1
jQuery: 1.12.4
jQuery UI: 1.10.4

在这些版本之外,我遇到了一个正在加载的require.js问题,但似乎不适合我的配置。我得到了相同的错误(尽管行号不同),下面是现在的错误:

An unexpected error has occurred: 
 'Unable to get property 'expanded' of undefined or null reference'
 The url is 'http://as400/rui/scripts/jqgrid-4.11.1/js/jquery.jqgrid.min.js?v=5.15b'
 The line number is 554

问题的根源还是一样的。虽然tregrid数据在网格中仍然可见,但它对jqgrid脚本似乎是不可见的。加载之前存在的行属性是不可访问的,但是在更新期间加载的行确实是可用的,可扩展(一次),并且位于网格中的正确位置。

好吧,这需要大量的调试,但我找到了答案。秘诀在于树网格的loadonce属性。此属性必须具有false的值,以便允许树网格动态加载其他节点。这与该行的isleaf属性密切相关。我发现,如果树网格具有loadonce: true,并且任何行具有isleaf: false并且子节点未加载,那么当您扩展该子节点时,所有本地数据都被删除并由子行数据替换,但是网格本身被正确操作并与本地数据不同步。loadonce: false抑制本地数据的删除,本地数据和网格保持同步。

也许这是一个bug。如果你有loadonce: true,也许tregrid应该抑制额外节点的发帖。而不是使网格和本地数据不同步。

顺便说一句,我使用邻接模型。