loadComplete 和 gridComplete 事件有什么区别?

IT技术 javascript datagrid jqgrid
2021-02-10 09:30:16

这个问题起源于我在其中查看Oleg和 demo-grids 的这个答案

gridComplete

这会在所有数据加载到网格中并且所有其他进程完成后触发。此外,该事件独立于数据类型参数以及在对分页等进行排序后触发。

loadComplete

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

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

所以我想知道 - 为什么在演示中,loadComplete用于改变细胞的颜色而不是gridComplete

2个回答

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

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

以下是优点loadComplete

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

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

另一个缺点是gridComplete可以查看是否检查addXmlData(see here ) 和addJSONData(see here ) from where 的代码,updatepager因此gridComplete将被调用。如果使用loadonce: true和内部参数data_index将填充从服务器返回的完整数据。使用时可以看到loadonce: truegridComplete从服务器加载第一页数据后将调用回调此时data_index只包含页面的数据。loadComplete从服务器返回的所有数据被处理并本地保存data之后,另一端将稍后调用_index

如果从服务器加载数据,而如果你不使用loadonce: true选项,clearGridDataaddRowDatadelRowData那么你可以使用gridComplete的替代loadComplete

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

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

这一行来自函数updatePager.

您可以loadCompletepopulate函数中找到(第 1757 行)。与 不同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在于传递了一个额外的参数。

可能存在我尚未遇到的细微差异……并且可能存在调用一个而另一个未调用的情况,但我注意到在排序和分页时,两者都被调用。