16

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

gridComplete

在所有数据加载到网格中并且所有其他过程都完成后触发。此外,事件的触发独立于数据类型参数和分页排序等之后。

loadComplete

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

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

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

4

2 回答 2

28

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

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

以下是以下优点loadComplete

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

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

另一个缺点是gridComplete可以查看是否从调用的位置检查addXmlData参见此处)和addJSONData(参见此处)的代码,因此将被调用。如果使用和内部参数,将填充从服务器返回的完整数据。使用时一目了然;从服务器加载第一页数据后,将调用回调。此时,只包含页面的数据。另一端将在服务器返回的所有数据都经过处理并在本地保存后调用。 updatepagergridCompleteloadonce: truedata_indexloadonce: truegridCompletedata_indexloadCompletedata_index

如果您从服务器加载数据并且不使用选项loadonce: trueclearGridData那么您可以使用而不是.addRowDatadelRowDatagridCompleteloadComplete

于 2013-03-15T18:05:03.693 回答
3

查看 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传递了一个额外的参数。

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

于 2013-03-15T16:48:15.903 回答