2016-10-21 60 views
0

我有大量物料清單(BOM),我已將其加載到jqGrid Treegrid中。它有大約500行。由於各種原因,我試圖將數據塊保持在64K以下,所以對於較大的BOM,我不會加載最深的葉子,例如比級別6更深的任何東西。我想動態加載那些當用戶選擇擴展最初開始崩潰,因爲它沒有加載。大多數一切按預期工作。用戶可以摺疊並展開已加載的任何節點。但是,當用戶單擊以展開缺少子節點的節點時,服務器將返回其所有子節點,並且它會正確顯示在treegrid中。如果其中的任何一個孩子有摺疊的節點,用戶可以將這些擴展到分支的末尾。但那是正常行爲停止的地方。一旦用戶單擊以展開缺少子節點的任何節點,只有最近的服務器響應中包含的節點才能展開。沒有什麼可以摺疊。所報告的錯誤是:jqGrid Treegrid在數據的動態加載之後不展開和摺疊行

An unexpected error has occurred: 
'Unable to get property 'isleaf' of undefined or null reference' 
The url is '' 
The line number is 92 

該行數是指是grid.treegrid.js

這裏所述源文件是用於擴展小節點失蹤兒童的示例響應。

{"page":"1", 
"total":"1", 
"records":"3", 
"rows":[ 
    {"id":"491","hide":false,"cell":["491","M-065934-1","BRACKET","M","1","1",".00","","$.00","478","7","false","false"]}, 
    {"id":"492","hide":false,"cell":["492","M-065934-2","COLLAR","M","1","1",".00","","$.00","478","7","false","true"]}, 
    {"id":"493","hide":false,"cell":["493","PD M6 X 20","PIN,DOWEL","P","2","2",".00","","$.00","478","7","false","true"]} 
]} 

每行中的最後四個值是父級,級別,展開和isleaf。在這種情況下,一旦數據被加載,只有行491是可擴展的,並且圍繞這三行的任何行(包括父級478)都不可摺疊。我需要看什麼來確定問題?裝載有沒有影響?我不是手動設置加載任何行。當我加載網格時,我知道哪些行有卸載的子節點。我是否需要手動設置該值?

的jqGrid(免費):4.4.3
jQuery的:1.9.0
jQuery用戶界面:23年8月1日

編輯:我已經升級到以下版本: 的jqGrid(免費):4.11 0.1
的jQuery:1.12.4
jQuery用戶界面:1.10.4

除了這些我碰到與正在加載require.js問題的版本,但似乎並沒有發揮好與我的配置。我得到相同的錯誤(雖然行號不同),現在是錯誤:

An unexpected error has occurred: 
'Unable to get property 'expanded' of undefined or null reference' 
The url is 'http://as400/rui/scripts/jqgrid-4.11.1/js/jquery.jqgrid.min.js?v=5.15b' 
The line number is 554 

問題的根源保持不變。雖然treegrid數據在網格中保持可見,但它似乎對jqgrid腳本不可見。在加載之前那些行的屬性是不可訪問的,但在更新期間加載的行確實可用,可擴展(一次),並且位於網格中的正確位置。

+0

您使用哪個版本的jqGrid(可以使用)以及從哪個版本的jqGrid([免費jqGrid](https://github.com/free-jqgrid/jqGrid),商業版[Guriddo jqGrid JS] /guriddo.net/?page_id=103334)或<= 4.7版本中的舊jqGrid)。 'grid.treegrid.js'中的第92行在不同版本的jqGrid中有不同的內容。此外,您發佈的數據應該與您應該包含的JavaScript代碼相對應。我建議你嘗試從[CDN](https://github.com/free-jqgrid/jqGrid/wiki/Access-free-jqGrid-from-different-CDNs)加載免費的jqGrid 4.13.4並重複測試。 – Oleg

+0

是否有關於4.13.4的majic?我從github下載了4.13.5,但沒有奏效。我使用的軟件是一個包含jqGrid的開源框架。我猜這已經很老了。 – jmarkmurphy

+0

1)版本4.4.3太舊,並且很長一段時間沒有任何支持。 2)我改變了免費的jqGrid fork中的TreeGrid的代碼來提高它的性能。你寫道你在TreeGrid中加載了許多節點。因此它可能對你有幫助。 3)如果你的代碼不工作,那麼你應該創建演示,該演示使用非微型jqGrid('jquery.jqgrid.src.js')並重現該問題。或者,您應該至少發佈創建jqGrid的JavaScript代碼。 – Oleg

回答

0

好吧,它花了很多調試,但我找到了答案。祕訣在於treegrid的loadonce屬性。此屬性必須具有值false才能允許treegrid動態加載其他節點。這與該行的isleaf屬性結合在一起。我發現如果treegrid具有loadonce: true,並且任何行都有isleaf: false且子節點未加載,那麼當展開該子節點時,將刪除所有本地數據並將其替換爲子行數據,但網格本身爲正確操作並與本地數據不同步。 loadonce: false禁止刪除本地數據,並且本地數據和網格保持同步。

也許這是一個錯誤。如果你有loadonce: true,可能treegrid應該抑制額外節點的發佈。而不是使網格和本地數據不同步。

順便說一句,我正在使用這種鄰接模型。

+0

我建議您在摺疊節點之後檢查與Web瀏覽器的開發人員工具相關的網格。如果節點被移除,那麼你應該看不到有舊節點的隱藏行(你應該看到沒有''elements)。通過在免費的jqGrid 4.13.5中使用'unloadNodeOnCollapse:false',你可以強制行爲。任何有關兒童的數據都將從內部'data'參數和網格DOM中刪除。 – Oleg

+0

這就是我的發現。在Chrome開發人員工具中,通過調試腳本。本地數據被清除,並且當'loadonce:true'被設置,並且一個未加載的節點被擴展時用子行代替。這發生在'grid.base.js'中的'addJSONData'函數中。這是它的代碼'locdata =(ts.p.datatype!=「local」&& ts.p.loadonce)|| ts.p.datatype ==「jsonstring」; if(locdata){ts.p.data = []; ts.p._index = {}; ts.p.localReader.id = locid;}'。之後,這些行將被添加到DOM中的網格中。這使網格和本地數據不同步。 – jmarkmurphy

+0

對不起,但我不確定你在最後的評論中寫了哪個版本的jqGrid。我再說一遍,在所有版本的jqGrid中,loadonce:true'的用法都是錯誤的:有些版本可以忽略這個選項,但有些可能有副作用。在使用TreeGrid的情況下,TreeGrid總是填充「數據」,並且可以通知jqGrid完整的數據只能通過服務器響應的使用'loaded'屬性加載。因此,在使用TreeGrid的情況下,「loadonce:true」選項完全沒有意義。 – Oleg