Javascript 在jqGrid中加载详细网格时,如何禁用主网格行选择?

Javascript 在jqGrid中加载详细网格时,如何禁用主网格行选择?,javascript,jquery,jqgrid,Javascript,Jquery,Jqgrid,我有一个主细节jqGrid,它工作得很好。详细信息网格是基于主网格所选行的单元格值和对API的ajax调用填充的,即数据类型:“json”和url:'http://myServiceurl/rowdata.id“ 但是,对于某些主控行,详细信息行的数据集需要一些时间才能加载,并且详细信息网格显示“加载…”。这是非常好的,直到用户在主网格中单击另一行,而详细网格仍在“加载…”。这是一个问题,因为我正在加载详图网格的标题上的一些附加信息,而详图网格上的数据仍然从上一行加载选择详图网格的标题更改以反映

我有一个主细节jqGrid,它工作得很好。详细信息网格是基于主网格所选行的单元格值和对API的ajax调用填充的,即
数据类型:“json”和
url:'http://myServiceurl/rowdata.id“

但是,对于某些主控行,详细信息行的数据集需要一些时间才能加载,并且详细信息网格显示“加载…”。这是非常好的,直到用户在主网格中单击另一行,而详细网格仍在“加载…”。这是一个问题,因为我正在加载详图网格的
标题
上的一些附加信息,而详图网格上的数据仍然从上一行加载选择详图网格的标题更改以反映当前主网格中选定的行,但实际表数据来自主网格中选定的上一行

主详图网格编码如下主网格上的
jqgrid
选项所示-

onSelectRow: function(ids) {      //load the detail table tabDiv2
                $("#"+divToHide).show();    //show the hidden div for detail grid
                var rowdata = jQuery("#"+tabDiv).getRowData(ids);
                    jQuery("#"+tabDiv2).jqGrid('setGridParam',{url:useruri+"/"+rowdata.dbsid,
                                                           datatype: 'json'})
                    jQuery("#"+tabDiv2).jqGrid('setCaption',"Database Name: "+rowdata.dbname)
                    .trigger('reloadGrid');
                },
我可以想象的一个解决方案是在主网格上使用
beforeselectionRow
选项,并检查是否仍在加载详细网格-

beforeSelectRow: function(){
       //check if detail grid is fully loaded <--
       //if fully loaded return true else return false
}
在选择行之前:函数(){

//检查细节网格是否已完全加载使用下面的代码解决问题。但是,基于我关于如何在选择Row
之前使用
解决问题的问题,我更喜欢@Oleg的答案。但以防万一,下面是另一种解决方法

通过在请求前在主网格
上设置
setgridparam
,并在细节网格上设置
loadcomplete

onSelectRow: function(ids) {      //load the detail table tabDiv2
                $("#"+divToHide).show();    //show the hidden div for detail grid
                var rowdata = jQuery("#"+tabDiv).getRowData(ids);
                    jQuery("#"+tabDiv2).jqGrid('setGridParam',{url:useruri+"/"+rowdata.dbsid,
                                                           datatype: 'json',
                                                           beforeRequest: function(){
                                                             jQuery("#"+tabDiv).jqGrid('setGridParam',{
                                                                          beforeSelectRow: function(){
                                                                            return false;
                                                                          }
                                                             })
                                                           },
                                                         loadComplete:function(){
                                                           jQuery("#"+tabDiv).jqGrid('setGridParam',{
                                                                        beforeSelectRow: function(){
                                                                          return true;
                                                                        }
                                                           })
                                                         }
                                                       })
                    jQuery("#"+tabDiv2).jqGrid('setCaption',"Database Name:&nbsp;"+rowdata.dbname)
                    .trigger('reloadGrid');
                }
jqGrid set
$(“#”+tabDiv2)[0]。grid.hDiv。在Ajax请求加载网格期间,加载
true
是挂起的。然后,您可以在第一个网格中仅使用以下回调

beforeSelectRow: function () {
    var detailGrid = $("#"+tabDiv2)[0];
    return detailGrid != null && detailGrid.grid != null && detailGrid.grid.hDiv.loading ?
        false : true;
}

这是一种用更少代码实现的好方法。再次感谢@Oleg!出现了一个新问题。我现在使用
loadError:function(jqXHR){$('#alertDiv.show();}
来显示警报(基本上是引导警报类型的
),如果详细信息网格中没有数据或错误。当我这样做时,您上面的代码将停止工作。不完全确定原因,但我在下面发布的答案仍然可以工作,只需稍作修改。@Annjawn:您使用的jqGrid版本以及jqGrid(、商业版或旧版jqGrid)的哪个分支,谢谢@Oleg,我会找到版本(我使用了很多插件,但记不清所有版本)。我会仔细考虑一下你的建议,因为我喜欢这种方法。它更干净。