为啥在 GridUnload 之后 free-jqgrid 不重置行 ID?

Posted

技术标签:

【中文标题】为啥在 GridUnload 之后 free-jqgrid 不重置行 ID?【英文标题】:Why is free-jqgrid not resetting row ids after GridUnload?为什么在 GridUnload 之后 free-jqgrid 不重置行 ID? 【发布时间】:2018-05-12 13:24:49 【问题描述】:

问题

我有一个非常复杂,相当过时的 jqgrid 实现,我正在升级到最新的 free-jqgrid,我们遇到了一个问题,在通过卸载清除网格后,当我们重新初始化网格时,行id 比他们应该开始的要高。

它们似乎仍在增加而不是重新开始。在我们重新渲染之前,我需要清除一些全局计数器以使网格完全清除吗?

网格清除

        if ( this.timesheet_grid ) 
            this.timesheet_grid.grid.jqGrid( 'GridUnload' );
            this.timesheet_grid.grid = null;
            this.timesheet_grid = null;

运行 GridUnload 后的行

显示类似jqg56的ID

自发布以来我尝试过的东西

GridDestroy clearGridBeforeUnload

解决方案

正如@Oleg 所建议的,我只需要在处理网格数据时手动设置 id 属性。

【问题讨论】:

在此处查看 github 问题:github.com/free-jqgrid/jqGrid/issues/400 【参考方案1】:

我发现您错误地理解了 rowid 的含义和输入数据的要求。我特别想知道托尼关于重置$.jgrid.guid 的建议。我觉得这个建议非常糟糕,因为它看起来像是一个解决方案,但它会产生更严重的问题,因为问题已经解决了!

首先,了解什么是rowid很重要。 Rowid 是网格行的id 属性的值:网格主体的<tr> 元素的id 值(请参阅here)。 rowid 被用作 jqGrid 几乎所有回调和事件的参数。因为 jqGrid 必须为每一行分配 id 属性,并且网格的输入数据必须包含 rowid 信息! rowids 的存在对于工作 jqGrid 至关重要。只是因为 jqGrid 生成唯一的 rowids 以防输入数据错误。生成 id 的替代方法是完全阻止创建网格。

jqGrid 容忍错误,只为一些简单的网格指定输入数据中的 rowid,其中只需要显示一些简单的数据,而永远不需要使用 rowid。如果您使用 id,那么您应该只通过一种方式解决问题:您必须修复您的输入数据。例如,您可以在输入数据的每个元素中包含具有唯一值的 id 属性。您应该考虑到,不仅在网格中,而且在整个 html 页面中都不存在 id 重复项。如果您的 HTML 页面具有多个作为一个网格(包含子网格的包含网格),则强烈建议始终为每个网格使用具有唯一值的 idPrefix 选项。

$.jgrid.guid 的重置是非常危险,它可能会破坏 jqGrid 的功能,因为创建具有重复 id 值的元素。 $.jgrid.guid 属性是全局。它在页面上的所有网格和子网格中都很常见。手动重置$.jgrid.guid 后,简单的子网格场景将产生 id 重复。它将在 jqGrid 代码的许多 处使用的$.jgrid.randId() 方法中使用。比如inlineNav使用的方法addRow就使用了该方法。

我再次更清楚地重复我的建议。如果您使用 rowids 或者如果 rowids 的值在某种程度上对您很重要,那么您必须将 id 属性包含到每个输入数据项中。如果其他一些属性已经具有唯一值,那么您可以在colModel 的对应列中添加key: true(只能在一列中使用key: true)。或者,如果输入数据的myId 属性包含唯一的rowid 而不是默认的id 属性,则可以添加prmNames: id: "myId"

【讨论】:

系统使用 uuid,这就是它创建更高 id 的原因吗? @catbadger:你能更清楚地解释你的意思吗?我无法理解你,因为你没有发布你的代码。我不知道你用的是哪个datatype,不管你是用简单的jqGrid,还是用摸索的jqGrid,subgrids,TreeGrid等等。哪种格式具有网格的输入数据以及您使用哪种colModel?如果我们在同一个细节级别上讨论这个问题,我帮不了你。 我想我在评论时误解了你的帖子。因此,在网格被擦除然后重新设置后并不总是以 jqg1 开头的行 ID 不能与我不想存储在网格中的并行数据数组对齐?旧的 jqgrid 支持这一点,我们根据状态信息在一个有 5-10 个网格的页面中做很多自定义的东西。我们需要每个网格都有自己的一组行 ID,这允许我们将这些信息与我们正在使用的非常特定的 json 并行化。这意味着 rowid 必须是有序的,并且在每个网格中从 1 开始。 @catbadger:我认为我们谈论不同的事情。您能否回答我的问题:如何在网格中填充数据?如果您希望重新加载后的行具有相同的 id,那么您只需 set 将您想要的值设置为 id 属性。您可以在客户端或服务器端设置id。我无法为您提供更多建议,因为我不知道您使用哪种网格以及以何种方式创建它并在网格中填充数据,无论您是显示数据还是编辑它,是否使用本地/远程分页/搜索/过滤与否。 @catbadger:您没有写出您现在使用的 jqGrid 版本、jqGrid 的哪个分支以及您指的是哪个“旧 jqgrid”版本。非常旧的版本分配的 id 像 rowIndex: 1, 2, 3... 例如,值在排序时更改(如果用户单击列标题)。【参考方案2】:

jqGrid 使用通用计数器来确保在使用内置 id 生成器时不会出现重复值。

要重置值,您需要将 guid 参数设置为 1 - 即

$.jgrid.guid =1;

卸载网格后

【讨论】:

这是一个很大的帮助。谢谢@Tony,我肯定需要在我的包装类中使用它。 所以所有网格都使用同一个计数器?哦,这将导致一些重构...... 该变量存储在加载网格文件时加载的普通 $.jgrid 对象中。 如果您需要为此做很多工作,我建议您覆盖 randId 函数以满足您的要求。函数定义为:...randId : function( prefix ) return (prefix || $.jgrid.uidPref) + ($.jgrid.guid++); ,。这样您就可以在加载网格文件后轻松添加代码$.jgrid.randId = function()...【参考方案3】:

如果解决方案基于对产品行为的了解,那么这是一个很好的解决方案。

如果我们试图在不知道行为的情况下解决问题 - 这是一个危险的解决方案。

这很容易说 - 这是一个糟糕的解决方案,使用这个解决方案非常危险 - 所以我的问题是:

如果用户在某些情况下重新加载页面,计数器会发生什么情况?

答案是:计数器已重置,我们会遇到上述答案中描述的相同情况。

【讨论】:

以上是关于为啥在 GridUnload 之后 free-jqgrid 不重置行 ID?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 setState 之后调用 getDerivedStateFromProps?

为啥在 setContentView() 之后 UI 不加载,而是在 onCreate() 执行之后加载?

为啥在 .distinct() 之后总是有 .collect()?

为啥 TabBar 在 segue 之后隐藏?

为啥 QWebEngineUrlRequestInterceptor 在 app.quit() 之后仍然存在

为啥vue在nexttick之后不更新数据?