2011-11-15 58 views
3

在過去的幾天裏,我一直在撕掉我的頭髮。就像問題的簡要概述一樣。我正在使用JqGrid 4.2.0(寫作時的最新版本)。在一個頁面中,我有兩個網格。一個在左邊,希望充當導航員。我想在右側網格中加載數據,數據由左側單擊的項目的行ID確定。JQGrid使用OnSelectRow在另一個網格上加載數據

我的問題是,第一個選定的行ID會「卡住」,並且將來所有的ajax調用都是相同的rowid(例如:如果第一個選定行是514,則每個其他選定行將在ajax調用上輸出514加載其他網格,如果第一次被選中是513,所有其他513等)

我懷疑它可能是某種變量交叉或某些因爲我在整個執行期間放置了警報調用以進行測試,並且它們都提醒正確ID號,直到下一個網格被加載的點,此時行ID變成錯誤的。

這裏是下面我的代碼:

第一段左側與OnSelectRow呼叫初始列表,和代碼的第二部分是用於在其上實際工作保持數據)的右手側的數據格

renderImportsList = function(url, data, firstrow) { 
var cnames = data.names; 
var cmodel = data.model; 
currentrow = firstrow; 
$("#imports_grid").jqGrid({ 
    url: url + "&type=list", 
    //caption: "Imports", 
    datatype: "json", 
    colNames: cnames, 
    colModel: cmodel, 
    recordtext: "<b>Imports: {1}</b>", 
    autowidth: true, 
    rowNum: 10000, 
    toolbar: [true,"top"], 
    pager: "#imports_grid_pager", 
    pgbuttons: false, 
    pginput: false, 
    viewrecords: true, 
    multiselect: false, 
    sortorder: "desc", 
    sortable: true, 
    onSelectRow: function(rowid) { 
     if (rowid != firstrow) { 
      if ($("#" + firstrow).hasClass("ui-state-highlight")) 
       $("#" + firstrow).removeClass("ui-state-highlight") 
     } 
     setTimeout(function() { 
      // Display import items 
      var itype = "checkpoint"; 
          alert(rowid); // This returns the right row ID so far 
      renderImportItems(url, rowid, itype); 
     }, 500); 
    }, 
    loadComplete: function() { 
     $("#imports_grid tr").css("border-color", "#666"); 
     $("tr.jqgroup").css("background", "#e9efff"); 
     $("tr.jqfoot").css("background", "#ced5e9"); 
     $("#imports_grid tr.jqfoot td").css("border-right", "none"); 
     $("#t_imports_grid").css("padding-bottom", "3px"); 
     $("#imports_grid").setSelection(firstrow, true); 
     $("#imports_grid").trigger("reloadGrid"); // Call to fix client-side sorting 
    } 
});  
$("#imports_grid").jqGrid('navGrid','#imports_grid_pager',{edit:false,add:false,del:false,search:false}); 
$("#imports_grid").trigger("reloadGrid"); // Call to fix client-side sorting 
sizeGrid("imports_grid"); 

}

這部分執行罰款,在這個階段,ROWID是我點擊,根據上面放置警告。下面是在上面的函數中從OnSelectRow中調用的第二個函數。

renderImportItems = function(url, rowid, itype) { 
$.ajax({ 
    url: srvrname + "applications/PMS/views/view/imports/" + itype + ".php", 
    success: function(data) { 
     var cnames = data.names; 
     var cmodel = data.model; 
        alert(rowid); // Here, the code still executes the right row ID 
     $("#checkpoint_grid").jqGrid({ 
      url: url + "&rid=" + rowid + "&type=" + itype, 
      // This is where it breaks. No matter what, I keep getting rowid to equal whichever row was selected the very first time the grid was clicked (or loaded programatically onload) 
      datatype: "json", 
      colNames: cnames, 
      colModel: cmodel, 
      recordtext: "<b>Total: {1}</b>", 
      autowidth: true, 
      rowNum: 500, 
      pager: "#" + itype + "_grid_pager", 
      pgbuttons: false, 
      pginput: false, 
      viewrecords: true, 
      multiselect: false, 
      sortorder: "desc", 
      sortable: true, 
      loadComplete: function() { 
       $("#" + itype + "_grid tr").css("border-color", "#666"); 
       $("tr.jqgroup").css("background", "#e9efff"); 
       $("tr.jqfoot").css("background", "#ced5e9"); 
       $("#" + itype + "_grid tr.jqfoot td").css("border-right", "none"); 
       $("#" + itype + "_grid").trigger("reloadGrid"); // Call to fix client-side sorting 
      } 
     }); 
     $("#" + itype + "_grid").jqGrid('navGrid','#' + itype + 'grid_pager',{edit:false,add:false,del:false,search:false}); 
     $("#" + itype + "_grid").trigger("reloadGrid"); // Call to fix client-side sorting 
     sizeGrid(itype + "_grid"); 
    } 
}); 

}

正如你可以在上面看到:在處第一個警報被稱爲點;它仍然輸出正確的ID號碼,但一旦第二個網格被初始化;該ID返回到第一次呼叫時初始設定的值。

提供的任何幫助將不勝感激。如果有幫助,這裏有一些螢火輸出來證明這個問題...

(域名隱私刪除)

(先裝:方案:FIRSTROW選擇= 514) 響應://mydomain.com /views/view/grid.php?rid=514 &類型=關卡& _search =假& ND = 1321336809180個&行= 500 &頁= 1 & SIDX = & SORD =降序

(已點擊行:選擇的行= 503) 迴應:// mydo main.com/views/view/grid.php?rid=514 &類型=關卡& _search =假& ND = 1321336863994個&行= 500 &頁= 1 & SIDX = & SORD =降序

(點擊的行:選定的行= 510) 迴應://mydomain.com/views/view/grid.php?擺脫= 514 &類型=關卡& _search =假& ND = 1321336864848個&行= 500 &頁面= 1 & SIDX = & SORD =遞減

回答

2

基於從第一格的主鍵數據第二網格我已經經歷了我自己也一樣。我建議你定義onSelectRow功能外網格與數據類型設置爲「本地」,只有改變內onSelectRow每個負載之間的改變部分:

$("#checkpoint_grid").jqGrid('setGridParam', { 
    url: null 
}).jqGrid('setGridParam', { 
    url: url + "&rid=" + rowid + "&type=" + itype, 
    datatype: "json" 
}).trigger("reloadGrid"); 

我通常做這與postData: null,但我認爲根本問題是jqGrid緩存一些網格參數。

+0

這完成了絕招,謝謝! – Preller

0

我覺得下面的步驟應該工作:

  1. 調用onRowSelect函數。設置異步:假你的Ajax調用(可選)與rowid應保持作爲一個全局變量
  2. 刷新使用This
2

你應該包括GridUnload用於$("#checkpoint_grid")內部的renderImportItems(對於var cmodel = data.model;後爲例):

$("#checkpoint_grid").jqGrid('GridUnload'); 

的問題是,其創建網格代碼應該被執行一次。代碼創建例如網格標題,尋呼機和除網格體外的其他一些區域。然後,Ajax請求將獲取網格的數據並填充正文。如果用戶單擊列標題按列對數據進行排序,或者如果用戶單擊「下一頁」按鈕,則只會在網格中刷新數據。所以應該只創建一次網格。如果下一個呼叫將完成到已經存在的網格,則該呼叫將被忽略。它的代碼是the line(內部屬性grid將被設置爲here)。

此外,我會包括cache: false參數至少在第二個$.ajax呼叫(renderImportItems裏面的呼叫)。

Here你會發現一個使用GridUnload的演示。