【问题标题】:Can trigger(“reloadGrid”) works when 'loadonce: true' in jqGrid?jqGrid中的'loadonce:true'时触发(“reloadGrid”)可以工作吗?
【发布时间】:2016-05-18 04:18:05
【问题描述】:

我正在使用的 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 !!!

是的,它说 “仅当 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').

所以这个答案实际上解决了我面临的一个问题。我有一个具有loadonce:true 的 jqGrid。 (在这里我关心排序,它工作得很好)。但后来我不得不稍微更改代码以使用新的服务器数据重新加载 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 时重新加载?

【问题讨论】:

    标签: javascript jqgrid


    【解决方案1】:

    首先,我强烈建议您将您使用的 jqGrid 从版本 4.4.0 升级到 free jqGrid 4.12.1。免费的 jqGrid 是我从 2014 年底开始开发的 jqGrid 的分支。有关更多信息,请参阅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) 和排序参数 (sortname、sortorder) 的值,并使用新选项重新加载当前显示的页面通过触发reloadGrid 事件。 jqGrid 将对数据进行排序并显示请求的页面。因此,了解.trigger('reloadGrid') 也适用于本地数据非常重要。

    如果您将datatype:'xml' 与loadonce: true 一起使用,则服务器必须返回所有数据。数据必须仅按请求的sortname、sortorder 选项(对服务器的请求的参数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。

    【讨论】:

    • 谢谢,一如既往的好回答。不幸的是,我无法更改该 jqGrid 版本。这是生产环境中的一个。但我认为我仍然可以完成工作。我建议他们改用你提到的新版本。
    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多