可以触发(“reloadGrid”)在jqGrid中的“loadonce: true”时工作

Can trigger(“reloadGrid”) works when 'loadonce: true' in jqGrid?

本文关键字:loadonce 中的 工作 true jqGrid reloadGrid      更新时间:2023-09-26

我正在使用的jqGrid源文件在顶部显示其版本为jqGrid 4.4.0,日期为Date 2012-06-14

在这个维基页面中,它说trigger(“reloadGrid”)

Reloads the grid with the current settings. This means that a new request is send to the server if datatype is xml or json. This method should be applied to an already-constructed grid. Pay attention that this method does not change HEADER information, that means that any changes to colModel would not be affected. You should use gridUnload to reload new configuration with different colModel. IT'S WORK ONLY IF loadonce: false !!!

是的,它说"只有当加载一次:错误!!时才有效">

这个 SO 答案暗示了一些黑客。它说,

If you use loadonce:true jqGrid change the datatype parameters to 'local' after the first load of data from the grid. All next grid reloading (sorting, paging, filtering) works local. If you want refresh the grid data from the server one more time you should set datatype to its original value ('json' or 'xml').

所以这个答案实际上解决了我面临的一个问题。我有一个 jqGrid,它有loadonce:true。(在这里我关心排序,它工作得很好(。但后来我不得不稍微更改代码以使用新的服务器数据重新加载 jqGrid。(用户可以更改一些细节并刷新表,以便 jqGrid 应该从服务器重新加载新获取的数据(。不幸的是,直到我loadonce:true更改为loadonce:false,这才起作用。

我称重新加载为这样,

$("#tableGrid").setGridParam({url:'myUrl'}).trigger('reloadGrid');

现在重新加载很好。但是排序消失了:(

然后我看到那个 SO 答案并将其更改为这样,

我在初始化网格时设置了loadonce:true。并调用重新加载,如下所示。

$("#tableGrid").setGridParam({url:'myUrl',datatype:'xml'}).trigger('reloadGrid');

之后,所有排序都很好,用户也可以重新加载网格。

这种方法正确吗?我认为它解决了问题,但是是吗? 因为文档说loadonce:true时无法重新加载?

首先,

我强烈建议您将从 4.4.0 版本使用的 jqGrid 升级到免费的 jqGrid 4.12.1。Free jqGrid 是我从 2014 年底开始开发的 jqGrid 的分支。有关其他信息,请参阅答案的更新部分的帖子和链接。你应该明白,jqGrid 4.4.0 真的是复古版本。它是在jQuery 1.4.3版本发布时发布的。当时IE9是Internet Explorer的最新版本,但IE6-IE8是最常用的版本。现在我们还有另一个时间进行Web开发。

重要的是要了解loadonce: true什么,.trigger('reloadGrid')什么。

jqGrid 支持在 JavaScript 对象内部本地保存数据。可以使用datatype: "local",使用data参数提供数据,然后使用本地分页,对数据进行排序和过滤。您可以更改页面大小 ( rowNum (, 页码 ( page ( 和排序参数 ( sortnamesortorder ( 的值,并通过触发事件使用新选项重新加载当前显示reloadGrid页面。jqGrid 将对数据进行排序并显示请求的页面。因此,重要的是要了解.trigger('reloadGrid')也适用于本地数据。

如果将datatype:'xml'loadonce: true一起使用,则服务器必须返回所有数据。数据必须按请求的sortnamesortorder选项(参数sidx和对服务器请求的sord(进行排序。因此,jqGrid 用所有数据填充内部data参数。jqGrid 显示返回数据的第一页(基于页面大小rowNum和页码page(。最后(在处理loadComplete回调之后(jqGrid 将 datatype 的原始值(在您的情况下"xml"(更改为 datatype: "local" 。现在,用户可以使用本地分页、排序和过滤数据,而无需与服务器进行任何通信。在每次排序、分页和过滤时,jqGrid 都使用reloadGrid事件来显示相应的数据页。

如果您需要从服务器重新加载数据,则只需恢复datatype参数的原始值并触发reloadGrid。例如

$("#tableGrid").setGridParam({datatype:'xml'}).trigger('reloadGrid');

如果您的服务器已正确实现,则用户将看到请求的数据页面,并且所有本地数据都将刷新。显示页面后,datatype将更改回datatype:'local'

如果您使用当前免费的 jqGrid,那么您可以使用以下选项

loadonce: true,
forceClientSorting: true,
navOptions: { reloadGridOptions: { fromServer: true } }

该选项forceClientSorting: true从服务器中删除了提供排序数据的要求。免费的jqGrid可以对服务器返回的数据进行排序。如果您使用navGrid则它会添加"刷新"/"重新加载"按钮。该选项navOptions: { reloadGridOptions: { fromServer: true } }更改按钮的行为,以便在用户单击按钮时从服务器重新加载数据。无需手动更改datatype