为什么free-jqgrid在GridUnload之后没有重置行ID?

时间:2017-11-28 23:19:52

标签: jqgrid

问题

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

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

网格清除

        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属性。

3 个答案:

答案 0 :(得分:1)

jqGrid使用公共计数器,以确保在使用id生成器生成时不会出现重复值。

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

$.jgrid.guid =1;

卸载网格后

答案 1 :(得分:1)

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

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

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

重置$.jgrid.guid 非常危险,由于创建了具有重复ID值的元素,因此可能会破坏jqGrid的功能。属性$.jgrid.guid全局。它在页面上的所有网格和子网格上都很常见。手动重置$.jgrid.guid后,简单的子网格方案将生成id重复项。它将在jqGrid代码的许多位置中使用的$.jgrid.randId()方法内部使用。例如,addRow使用的方法inlineNav使用该方法。

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

答案 2 :(得分:1)

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

如果我们试图解决问题,而不了解行为 - 这是一个危险的解决方案。

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

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

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