2012-09-20 44 views
10

我正在JqGrid上工作。爲什麼gridview:true用於?它是什麼意思?

我想知道這是什麼意思,如果我們指定gridview:true

而在什麼情況下我們需要提供?

我最近在做一個這樣的jqGrid,我的afterInsertRow沒有被調用,一旦我調用gridview:true現在調用。

這是我自己經歷過的一種情況,我想知道是否還有其他情況,我們應該知道是否使用gridview:true

請指導我。

+0

http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options&s[]=gridview詳細介紹了gridview的內容和原因。 –

+0

同意。查看我的答案瞭解更多細節。 –

+2

另外,我還想補充一點,'gridview'對這個選項來說是一個糟糕的名字,因爲除非你交叉引用文檔,否則它就意味着什麼......不知道我可以提出一個更好的理由,雖然:) –

回答

14

我同意gridview: true選項不好解釋在文檔中。在某些情況下(例如TreeGrid),該選項將自動設置。所以我試着解釋它是什麼意思,爲什麼我建議總是使用gridview: true選項,而不要使用afterInsertRow

許多人從一些其他的計算機語言開始,如JavaScript,並編寫了他的第一個程序,它們在有一些程序編寫風格後運行在網絡瀏覽器中。 3年前我有同樣的問題。 在HTML頁面上進行一些更改後,瞭解Web瀏覽器必須執行的操作很重要。在使用jQuery的使用中,這是你永久做的事情。

如果更改頁面上的某個DOM元素,則可以更改頁面上存在的所有其他DOM元素上的位置。如果您考慮浮動模型(如float: left)或許多其他CSS設置,您會明白,Web瀏覽器不能移動現有頁面的位圖表示並插入新插入的元素。所以網絡瀏覽器必須重新計算頁面上存在的所有元素的位置,並從另一個地方的元素移動一些。即使您更改元素的CSS樣式,也會發生如此名稱的重排。我建議您閱讀the article並查看有關該主題的視頻。

提高網頁瀏覽器性能的主要思路上述情況將爲,以減少頁面上的更改數量。所以你需要改變一個DOM元素的5種樣式,你應該在一個操作中做到這一點。您可以使用jQuery.css({...})以及所有更改的樣式,而不是5個單獨的調用。更好的辦法是定義一個CSS類並使用jQuery.addClass方法。

在jqGrid的情況下,需要用網格的所有行和單元填充<tbody>。如果您使用gridview: true選項,則jqGrid會將所有行的內容作爲帶有HTML片段的字符串進行收集。後來jqGrid調用jQuery.append,the line它在內部設置了innerHTML屬性來設置頁面上的整個HTML片段。

由於同樣的原因,你應該使用cellattrrowattrcustom formatters與HTML片段的作品所代表的單元格或行作爲字符串。最後,字符串將被附加到其他字符串,並將用於像上面描述的jQuery.append操作。

afterInsertRow回調函數的使用要求網格的每一行都將放置在頁面上調用afterInsertRow回調之前。因此,不可能使用gridview: true選項,並使頁面緩慢工作。

準確地說,我應該提到的是,我之前描述的性能下降只有在大網格的情況下才可見,並且在慢速網絡瀏覽器(如Internet Explorer,尤其是IE的舊版本) 。

5

按照jqGrid documentationgridview

在jqGrid的先前版本包括3.4.X,讀取相對大的數據集(> = 100的行數)引起的速度的問題。原因在於,因爲每個單元格都被插入到網格中,所以我們應用了大約5到6個jQuery調用。現在這個問題已經解決了;我們現在用jQuery append一次插入條目行。結果令人印象深刻 - 大約快3到5倍。如果我們一次插入所有的數據會有什麼結果?是的,這可以通過gridview選項的幫助完成(將其設置爲true)。結果是一個5到10倍的網格。當然,當這個選項設置爲true時,我們有一些限制。 如果設置爲true,我們不能使用treeGrid,subGrid或afterInsertRow事件。如果您不在網格中使用這三個選項,則可以將此選項設置爲true並享受速度。

所以通過使用這個選項,你可以得到一個很好的速度改進,但要注意它與treeGrid,subGrid或afterInsertRow不兼容。我相信這是侷限性的程度。如果您再發現,請告訴我們,以便更新文檔。


對於它的價值,實際上你可以see specific casesgrid.base.js方法addXmlDataaddJSONData其中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和子網格限制更加微妙,在沒有明確地叫出來碼。

+0

只有小的修正。您引用的文檔中的文本有小錯誤。 1)TreeGrid *的當前實現使用*'gridview:true'選項(它*設置*:參見[行](https://github.com/tonytomov/jqGrid/blob/v4.4.1/js/grid .treegrid.js#L135)代碼。2)文本「我們現在一次插入輸入行」是不正確的。該文本將在稍後被間接糾正:「如果我們一次插入**所有數據**,結果如何?」。在任何情況下,包含所有行的整個''都會在'gridview:true'的情況下被放置在頁面上,作爲* 1 *調用'jQuery.append'。 – Oleg