编辑:在这里找到了一个绝妙的解决方案:
使用location.reload(),尽管我不得不说我认为jquery的模式处理中存在错误。我不认为我的以下代码有误,但无法正常工作。 :(
用户单击按钮时,它会调用方法:
onClick(GroupInformationDialog(true)) ... etc
因此,该方法调用一个方法来查看是否应该基于传递的内容来隐藏或打开模式,其次基于执行ajax调用的另一种方法的结果来隐藏或打开模式:
function GroupInformationDialog(open) {
if (open) {
if (GetProviderInfo() == true) {
$("#groupinfo-dialog").modal("show");
} else {
// we got no real data so let's not show the modal at all
$("#groupinfo-dialog").modal("hide");
}
} else {
$("groupinfo-dialog").modal("hide");
}
return false;
}
和ajax调用:
function GetProviderInfo() {
event.preventDefault();
gid = $('#group_info option:selected').val()
pid = $("#provider_id").val()
$.ajax({
url: '{% url 'ipaswdb: get_group_info_data' %}',
data: "group_id=" + gid + "&prov_id=" + pid,
success: function (resp) {
if (resp['response'] == 'NOGROUP') {
alert("You must first select a group");
$("groupinfo-dialog").modal('hide'); //arg this doesn't work either
return false;
}
else if (resp['response'] == 'OK') {
//fill out form with data.
$("#gi_date_joined_group").val(resp['date_joined_group']);// = resp['credentialing_contact'];
$("#gi_provider_contact").val(resp['provider_contact']);
$("#gi_credentialing_contact").val(resp['credentialing_contact']);
return true;
}
else {
$("#gi_date_joined_group").val('');// = resp['credentialing_contact'];
$("#gi_provider_contact").val('');
$("#gi_credentialing_contact").val('');
return true;
}
}
});
}
问题在于,GetProviderInfo()中的返回true或false被忽略,就像GroupInformationDialog在GetProviderInfo被执行之前一直被求值一样,因此结果是始终弹出的模式对话框。
我什至试图拥有
$("#groupinfo-dialog").modal('hide');
在if(resp['response']=='NOGROUP')
代码部分中,没有骰子。
几乎就像我需要一个wait函数,我以为成功是要使用回调函数来解决的,可惜它并没有。
答案 0 :(得分:0)
您在此处混合同步和异步代码;您不能同步使用if (GetProviderInfo() == true)
,因为要从该函数返回的内容取决于异步ajax调用。
您当前拥有的return
语句将转到它们所包含的success
处理程序中;他们将不设置getProviderInfo
本身的返回值。在成功处理程序运行时,getProviderInfo
已经返回。
您可以让该函数返回一个promise(使用return $.ajax({...})
),并让调用者异步处理结果-但在这种情况下,仅隐藏/显示模式中的模式可能更简单。 ajax调用的success
处理程序。 (看来,当前无法正常工作的唯一原因只是一个错字:当您指$("groupinfo-dialog")
$("#groupinfo-dialog")