2012-11-23 56 views
1

我正在使用jQuery获取零件编号的供应商列表。 然后,我想在编辑窗体出现后加载一些关于供应商/零件编号组合的额外数据。问题是dataurl方法(我在beforeInitData方法中调用)来获取供应商在执行beforeShowForm方法之前未完成。因此,当表单第一次加载时,我没有供应商查询。有没有办法在dataUrl方法完成后运行该函数来获取额外的数据?jqgrid dataurl完成事件

我试过JQGrid editoptions dataurl not using ajax get?,但我知道会有冲突,因为ajaxSelectOptions方法会被每个请求调用,有时候我的请求会来自不同的需求不同的地方。

这里是我使用我的网格代码:

jQuery("#receiptPartsTable").jqGrid('editGridRow',"new", 
{ 
    height:400, 
    width:800, 
    reloadAfterSubmit:false, 
    recreateForm: true, 
    beforeInitData: function(form) 
    { 
     var selectedPart = rowData.part; 
     var selectedPartQty = rowData.qty; 
     //Getting list of suppliers 
     $("#receiptPartsTable").jqGrid('setColProp', 'supplier', { editoptions:{dataUrl:'getSuppliersForPart.php?part=' + rowData.part} }); 
    }, 
    beforeShowForm: function(form) 
    { 
     var selectedPart = rowData.part; 
     var selectedPartQty = rowData.qty; 
     $('#part').val(selectedPart); 
     $('#qty').val(selectedPartQty); 

     //$('#supplier').val() is not set yet; 
     var supplier = $('#supplier').val(); 

     //This method is getting called before there is a supplier 
     getPartDetails(rowData.part, supplier); 

     //Set up onChange listener. After selecting a supplier, get the part details 
     $('#supplier').change(function() { 
      var supplier = $('#supplier').val(); 
      getPartDetails(selectedPart, supplier); 
     }); 
    } 

回答

1

您没有公布的jqGrid的定义,您使用。执行上述代码的上下文也不太清楚。从当前选定的行之前获得rowData?你在哪里定义它?

尽管如此,我认为你已经走向了正确的方向,并且你已经找到了解决问题的正确方法。使用completeajaxSelectOptions回调可能是您可以使用的唯一方法。你写了一些“冲突”,但没有公布更多细节。

我会建议你检查this回调内的complete属性。 jqGrid设置context选项(请参阅the line$.ajax调用(完全类似于您已经发现自己的the answer)。所以你可以使用this.elem,this.optionsthis.vl里面的complete回调。 this.vl是在编辑现有行的情况下单元格中的值。通常它是将被选择的选项的名称。 this.options有树可以使用的重要属性:this.options.dataUrl,this.options.idthis.options.name。在表单编辑的情况下,值为this.options.idthis.options.name相同。在内联编辑的情况下,this.options.id将具有rowid和_作为前缀。它使您可以在使用dataUrl的不同选择中执行complete回调内部的不同代码。

还有一句话。在大多数情况下,你可以从beforeInitData去除setColProp通话和使用的方法在the answerthe another one建议:

ajaxSelectOptions: { 
    data: { 
     id: function() { 
      return $("#receiptPartsTable").getGridParam('selrow'); 
     }, 
     part: function() { 
      return rowData.part; 
     } 
    }, 
    complete: function (jqXHR, textStatus) { 
     var columName = this.options.name, response = jqXHR.responseText; 
     ... 
    } 
} 

只需使用editoptions: {dataUrl: "getSuppliersForPart.php"}的URL将与partid参数被追加(见上面的代码)。而不是id您可以使用getRowData从其他列中获取基于当前选定行的rowid的内容。

+0

感谢您的详细解答。我没有意识到我可以使用“这个”。 – Asagohan

+0

@Asagohan:不客气! – Oleg