首页 > 解决方案 > ajax 调用导致适合隐藏模式

问题描述

编辑:在这里找到了一个不优雅的解决方案:

AJAX成功后如何关闭模式窗口

使用 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')代码部分,没有骰子。

这几乎就像我需要一个等待函数,我认为成功是一个回调函数会处理它,但可惜它没有。

标签: javascriptjqueryajax

解决方案


您在这里混合了同步和异步代码;您不能同步使用if (GetProviderInfo() == true),因为您希望从该函数返回的内容取决于异步 ajax 调用。

您当前拥有的return语句将转到success它们所在的处理程序;他们不会为自己设置返回值getProviderInfo。到成功处理程序运行时,getProviderInfo已经返回。

您可以让该函数返回一个承诺(使用return $.ajax({...}))并让调用者异步处理结果——但在这种情况下,在 ajax 调用的success处理程序中隐藏/显示模式可能更简单。$("groupinfo-dialog")(看起来目前不工作的唯一原因只是一个错字:当你的意思是你有几个地方$("#groupinfo-dialog")


推荐阅读