我正在研究JqGrid。
如果我们指定gridview:true
,我想知道它是什么意思。
我们需要在什么情况下提供?
我最近正在研究一个这样的jqGrid而我的afterInsertRow
没有被调用,一旦我重新调用gridview:true
现在就调用了。
这是我自己经历的一个案例,我想知道是否还有其他案例,如果使用gridview:true
,我们应该知道。
请指导我。
答案 0 :(得分:14)
我同意文档中没有很好地解释gridview: true
选项。在某些情况下(如TreeGrid的情况),将自动设置选项。因此,我尝试解释它的含义以及为什么我建议始终使用gridview: true
选项并且永远不要使用afterInsertRow
。
许多人从一些其他计算机语言开始作为JavaScript,并编写了他的第一个程序,在他们有一些程序编写风格之后在Web浏览器中运行。我3年前遇到同样的问题。 了解在HTML页面上进行一些更改后,Web浏览器必须执行的操作非常重要。在使用jQuery时,你永远都会这样做。
如果更改页面上的某些DOM元素,则可以更改页面上现有的所有其他DOM元素的位置。如果您考虑浮动模型(如float: left
)或许多其他CSS设置,您将了解Web浏览器不能只移动现有页面的位图表示并插入新插入的元素。因此, Web浏览器必须重新计算页面上存在的所有元素的位置,并从另一个地方的元素移动一些。即使您更改了元素的CSS样式,也会发生如此命名的重排。我建议您阅读the article并查看有关该主题的视频。
如上所述,提高网络浏览器性能的主要思路是以减少页面上的更改次数。因此,您需要在一次操作中更改一个DOM元素的5种样式。您可以将jQuery.css({...})
用于所有已更改的样式,而不是5个单独的调用。更好的方法是定义一个CSS类并使用jQuery.addClass
方法。
在jqGrid的情况下,需要用<tbody>
填充网格的所有行和单元格。如果使用gridview: true
选项,则jqGrid会将所有行的内容收集为带有HTML片段的字符串。稍后jqGrid在the line中调用jQuery.append
,其中设置内部innerHTML
属性以在页面上设置整个HTML片段。
由于相同的原因,您应该使用cellattr
,rowattr
或custom formatters使用HTML片段表示单元格或行作为字符串。最后,字符串将被附加到其他字符串,并将在jQuery.append
操作中使用,如上所述。
afterInsertRow
回调函数的使用要求在调用afterInsertRow
回调之前,网格的每一行都将放置。因此,无法使用gridview: true
选项并慢慢处理页面。
确切地说,我应该提到我之前描述的性能下降只有在大网格的情况下才能看到,并且在网络浏览器速度慢的情况下(如Internet Explorer,尤其是旧版本的IE),大多数情况下都会看到。
答案 1 :(得分:5)
根据gridview
的{{3}}:
在包含3.4.X的jqGrid的先前版本中,读取相对较大的数据集(行数&gt; = 100)会导致速度问题。这样做的原因是,当每个单元格被插入到网格中时,我们应用了大约5到6个jQuery调用。现在这个问题解决了;我们现在使用jQuery追加一次插入条目行。结果令人印象深刻 - 大约快3到5倍。如果我们一次插入所有数据会得到什么结果?是的,这可以通过gridview选项(将其设置为true)来完成。结果是网格速度提高了5到10倍。当然,当此选项设置为true时,我们有一些限制。 如果设置为true,我们不能使用treeGrid,subGrid或afterInsertRow事件。如果您不在网格中使用这三个选项,则可以将此选项设置为true并享受速度。
因此,通过使用此选项,您可以获得良好的速度提升,但需要注意的是它与treeGrid,subGrid或afterInsertRow
不兼容。我认为这是限制的程度。如果您还没找到,请告诉我们,以便更新文档。
对于它的价值,您实际上grid.base.js
方法中可以jqGrid documentation addXmlData
和addJSONData
,其中afterInsertRow
被跳过:
if(ts.p.gridview === false ) {
$("tbody:first",t).append(rowData.join(''));
$(ts).triggerHandler("jqGridAfterInsertRow", [rid, rd, xmlr]);
if(afterInsRow) {ts.p.afterInsertRow.call(ts,rid,rd,xmlr);}
rowData=[];
}
treeGrid和subGrid限制更加细微,并且未在代码中明确调出。