当 jqGrid 中的 'loadonce: true' 时,trigger(“reloadGrid”) 可以工作吗?

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

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

在这个 wiki page 中说 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 !!!

是的,它说 "IT'S WORK ONLY IF loadonce: false !!!"

并且 this SO answer 为此提出了一些技巧。它说,

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。 (用户可以更改一些细节并刷新 table 因此 jqGrid 应该从服务器重新加载新获取的数据)。不幸的是,在我将 loadonce:true 更改为 loadonce:false 之前,这没有用。

我是这样调用重载的,

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

现在可以重新加载了。但是排序不见了:(

然后我看到那个 SO 回答并把它改成这样,

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

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

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

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

首先,我强烈建议您将您使用的 jqGrid 从版本 4.4.0 升级到 free jqGrid 4.12.1. Free jqGrid is the fork of jqGrid which I develop starting with end of 2014. See the post and the link from UPDATED part of the answer 以获取更多信息。你应该明白 jqGrid 4.4.0 是真正的复古版本。它是在 jQuery 1.4.3 版本时发布的。 IE9 是 Internet Explorer 的最新版本,但 IE6-IE8 是使用最多的版本。现在我们 另一个网络开发时间

了解 loadonce: true.trigger('reloadGrid') 的作用很重要。

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

如果您将 datatype:'xml'loadonce: true 一起使用,则服务器必须 return 所有数据 。数据必须仅按请求的 sortnamesortorder 选项(向服务器请求的参数 sidxsord 排序)。因此 jqGrid 用所有数据 填充内部 data 参数。 jqGrid 显示 returned 数据的第一页(基于页面大小 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 可以对来自服务器的数据进行排序 return。如果你使用 navGrid 然后它添加 "Refresh"/"Reload" 按钮。选项 navOptions: { reloadGridOptions: { fromServer: true } } 更改按钮的行为,如果用户单击该按钮,将从服务器重新加载数据。无需手动更改 datatype