首先對不起我的英文,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工作既不
誰能幫助我?
在此先感謝
感謝Oleg, 問題是我需要用戶返回ajax調用的客戶端信息。 雖然客戶端沒有點擊確定或取消對話框的按鈕,但我不能返回true或false來繼續添加操作。 –
@AlexCuervo:對不起,我仍然不明白爲什麼用戶每次點擊「提交」按鈕之前都需要單擊「確定」附加對話框。如果你需要一些額外的驗證,你可以使用'setTimeout',比如jQuery UI Autocomplete do。或者,您可以在輸入字段的旁邊添加更多按鈕,例如帶有'showOn:「按鈕的'jQuery UI Datepicker」。在驗證的方式將在用戶類型相同的對話框*中。以任何方式實現'errorTextFormat'回調,我認爲在每個有效的解決方案中都是必需的。 – Oleg
@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