2013-01-08 83 views
1

首先對不起我的英文,jqgrid中函數的異步返回

我正在使用jqgrid。我有一張管理客戶的桌子。當我想添加一個新的客戶端時,我在beforeSubmit事件中有一個ajax驗證來檢查客戶端是否存在於外部系統上。此函數的第一個參數是一個布爾值(如果爲真,將客戶的執行繼續,如果假停止)

beforeSubmit: function(postdata, formid) { 

     var form = formid[0]; 
     var hostId = $.trim(form.HOSTID.value); 
     var document = $.trim(form.DOCUMENT.value); 
     var idMurex = $.trim(form.IDMUREX.value); 

     var success; 

     processClientData(hostId, document, idMurex).done(function() { 

      alert('OK'); 
      success = true; 

     }).fail(function() { 

      alert('KO'); 
      success = false; 

     }); 

     return[success, '']; 

}, 

如果客戶端的存在與否的AJAX函數返回。如果客戶端存在,它將顯示一個確認對話框以確認是否繼續,具體取決於用戶是否同意客戶端信息。如果客戶端不存在,則顯示一個警告對話框,顯示錯誤消息。

function processClientData(hostId, document, idMurex) { 

     var def = $.Deferred(); 

     //SERVER RESPONSE IF EXISTS CLIENT 
     $.post('/watt/cambio_titularidad', {  
       oper: 'datos_cliente', 
       hostId: hostId, 
       document: document, 
       idMurex: idMurex 
      }, 
      function(response){ 

       //CLIENT EXISTS (SHOW CONFIRMATION DIALOG WITH CLIENT INFO) 
       if (response.success == true) { 
        $("#dialog_info_tablas").dialog({ 
         title: "CLIENT EXISTS", 
         modal: true, 
         buttons: { 
         "Ok": function() { 
          $(this).dialog("close"); 
          def.resolve(); 
         } 
         "Cancel": function() { 
          $(this).dialog("close"); 
          def.reject(); 
         } 
        } 
       }); 

       //CLIENT DOESN´T EXIST (SHOW ALERT DIALOG WITH ERROR MESSAGE) 
       } else { 
        $("#dialog_info_tablas").dialog({ 
         title: "CLIENT NOT EXISTS", 
         modal: true, 
         buttons: { 
          "Ok": function() { 
           $(this).dialog("close"); 
           def.reject(); 
          } 
         } 
        }); 
       }   
      }, 
      "json") 

      return def.promise(); 
     } 

我使用Deferred對象嘗試同步ajax調用。

問題是,在var成功具有正確值之前執行return語句。我不知道如何使它同步,我需要延遲返回,直到用戶單擊對話框按鈕,從而繼續添加客戶端。我試圖把裏面的return語句完成失敗功能,但它didn't工作既不

誰能幫助我?

在此先感謝

回答

1

我會建議你使用錯誤的形式,而不是提交的beforeSubmit內部實現額外的服務器端驗證的內部處理。回調beforeSubmit應該更好地用於客戶端驗證。

如果在編輯過程中向服務器提交任何數據,則Ajax請求將發送到服務器。服務器可以驗證輸入數據並返回錯誤消息。在這種情況下,在服務器響應中放置任何HTTP錯誤代碼是很重要的。您可以使用errorTextFormat表單編輯回調來根據從服務器返回的錯誤響應自定義顯示給用戶的錯誤消息。

+0

感謝Oleg, 問題是我需要用戶返回ajax調用的客戶端信息。 雖然客戶端沒有點擊確定或取消對話框的按鈕,但我不能返回true或false來繼續添加操作。 –

+0

@AlexCuervo:對不起,我仍然不明白爲什麼用戶每次點擊「提交」按鈕之前都需要單擊「確定」附加對話框。如果你需要一些額外的驗證,你可以使用'setTimeout',比如jQuery UI Autocomplete do。或者,您可以在輸入字段的旁邊添加更多按鈕,例如帶有'showOn:「按鈕的'jQuery UI Datepicker」。在驗證的方式將在用戶類型相同的對話框*中。以任何方式實現'errorTextFormat'回調,我認爲在每個有效的解決方案中都是必需的。 – Oleg

+0

@AlexCuervo:請參閱[答案](http://stackoverflow.com/a/9620311/315935)瞭解使用Datepicker with button的示例。完全像jQuery UI可以模仿靠近主要''元素的按鈕,你可以在'beforeShowForm'裏面或在[dataInit]裏面做同樣的事情(http://www.trirand.com/jqgridwiki/doku.php?id =維基:common_rules#editoptions)。 – Oleg