2011-11-15 57 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的演示。