loadComplete 和 gridComplete 事件有啥区别?

Posted

技术标签:

【中文标题】loadComplete 和 gridComplete 事件有啥区别?【英文标题】:What the difference between loadComplete and gridComplete events?loadComplete 和 gridComplete 事件有什么区别? 【发布时间】:2013-03-04 10:50:20 【问题描述】:

这个问题是在我查看了Oleg 的this 答案和其中的demo-grids 之后产生的。

gridComplete:

这会在所有数据加载到网格和所有其他数据后触发 流程完成。该事件也独立于 数据类型参数和排序后分页等。

loadComplete:

此事件在每次服务器请求后立即执行。数据 来自响应的数据取决于数据类型网格参数

从该文档中,我了解到gridComplete 在绘制网格结束时触发,loadComplete 在 jqGrid 完成与后端的通信后触发。

所以我想知道 - 为什么在演示中,loadComplete 用于更改单元格的颜色而不是 gridComplete

【问题讨论】:

如果不熟悉 loadComplete 和 gridComplete 属性之间的区别,我会假设 loadComplete 会加载所有数据、样式、布局和间距,而 gridComplete 只是从 loadComplete 方法中获取数据和渲染视图中的网格。 【参考方案1】:

我认为这个问题是 jqGrid 的许多用户提出的。所以知道答案很有趣。

我个人更喜欢使用loadComplete。如果您检查我发布的所有示例中的代码,您会发现 gridComplete 只有当原始海报在问题中发布它并且我会修改一些代码时。我更喜欢使用loadComplete,因为loadComplete 的一些优点和gridComplete 的缺点。

以下是loadComplete的优势:

这是最后一个回调,如果 整个网格体 将被重新加载,它将被调用。例如,在从服务器加载网格上的页面之后。重要的是要了解,如果用户更改某些列的排序或设置过滤器或选择网格的另一页;网格体将被重新加载。 loadComplete 有参数data 代表本地数据的完整页面或从服务器加载的完整数据。

另一方面,gridComplete 将从内部updatepager(参见here)调用(在当前版本的 jqGrid 4.4.4 中),将从delRowData 调用(参见@ 987654322@)、addRowData(见here)和clearGridData(见here)方法;除了addXmlData(见here)和addJSONData(见here)。这不是人们最想要的。

gridComplete 的另一个缺点可以查看是否检查addXmlData(请参阅here)和addJSONData(请参阅here)的代码从哪里updatepager 是被调用,所以 gridComplete 将被调用。如果使用loadonce: true,则内部参数data_index 将填充从服务器返回的完整数据。使用loadonce: true时可以看到;回调gridComplete将在从服务器加载第一页数据后调用。此时data_index 仅包含页面的数据。另一方面loadComplete将在服务器返回的所有数据都处理并保存在本地之后在data_index中调用。

如果您从服务器加载数据并且不使用loadonce: true 选项、clearGridDataaddRowDatadelRowData,那么您可以使用gridComplete 而不是loadComplete

【讨论】:

【参考方案2】:

查看jqGrid的源码(source)可以看到gridComplete只在grid.base的一行被调用。

1725: if($.isFunction(ts.p.gridComplete)) ts.p.gridComplete.call(ts);

这一行来自函数updatePager

您可以在 populate 函数(第 1757 行)中找到 loadComplete。与gridComplete 不同,它传递了一个额外的参数。两个回调都接收到this的引用,但loadComplete也接收到服务器返回的数据(或本地传入):

1858: case "xmlstring": 
if(lcf) ts.p.loadComplete.call(ts,dstr);

1869: case "jsonstring": 
if(lcf) ts.p.loadComplete.call(ts,dstr);

1881: 
case "local":
case "clientside":
if(lc)  lc.call(ts,req); 

问题是,函数populateupdatePager 经常串联发生,所以你看到在排序和分页时,两个回调都被调用了。不同之处再次在于 loadComplete 传递了一个额外的参数。

可能有一些我还没有遇到过的细微差别......并且可能存在一个被调用而另一个没有被调用的情况,但我注意到在排序和分页时,两者都被调用。

【讨论】:

以上是关于loadComplete 和 gridComplete 事件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

jQgrid“loadComplete”事件仅在第一次加载时才被调用

jPlayer on loadcomplete 事件

wpf webbrowser

Jqgride关于获取完数据可直接编辑

jqGrid设置符合条件的行选中

如何在jQGrid行中禁用超链接