loadComplete和gridComplete事件有什么区别?

时间:2013-03-15 16:15:28

标签: javascript datagrid jqgrid

这个问题源于我查看thisOleg答案以及其中的演示网格。

gridComplete

  

在将所有数据加载到网格和所有其他数据后,将触发此操作   流程完成。此事件也是独立的   数据类型参数和排序后的分页等。

loadComplete

  

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

从那些文档我明白gridComplete在绘图网格结束时触发,loadComplete在jqGrid完成与后端的通信后触发。

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

2 个答案:

答案 0 :(得分:26)

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

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

以下是loadComplete

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

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

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

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

答案 1 :(得分:3)

查看jqGrid (source)的来源,您可以看到gridComplete仅在grid.base的一行上调用。

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

这一行来自函数updatePager

您可以在loadComplete功能中找到populate(第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传递了额外的参数。

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