вызов ajax подходит для сокрытия модальных - PullRequest
0 голосов
/ 18 января 2019

РЕДАКТИРОВАТЬ: нашел не элегантное решение здесь:

Как закрыть модальное окно после успеха 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;
      }

    }
  });
}

Проблема в том, что возвращаемое значение true или false в GetProviderInfo () игнорируется, это похоже на то, что GroupInformationDialog оценивается полностью перед GetProviderInfo, поэтому в результате появляется модальное диалоговое окно, которое всегда всплывает.

Я даже пытался получить

$("#groupinfo-dialog").modal('hide');      

в разделе кода if(resp['response']=='NOGROUP'), без кубиков.

Это почти как если бы мне нужна функция ожидания, я думал, что успех - это функция обратного вызова, которая позаботится об этом, но, увы, это не так.

1 Ответ

0 голосов
/ 18 января 2019

Вы смешиваете синхронный и асинхронный код здесь; вы не можете синхронно использовать if (GetProviderInfo() == true), поскольку то, что вы хотите вернуть из этой функции, зависит от асинхронного вызова ajax.

Операторы return, которые у вас есть, будут переданы обработчику success, в котором они содержатся; они не сами устанавливают возвращаемое значение для getProviderInfo. К моменту запуска обработчика успеха getProviderInfo уже вернулось.

Вы могли бы сделать так, чтобы эта функция возвращала обещание (используя return $.ajax({...})), и вызывающий мог обрабатывать результаты асинхронно - но, похоже, в этом случае может быть проще просто скрыть / показать модал из вызова ajax success обработчик. (Похоже, единственная причина, по которой в данный момент не работает, это просто опечатка: есть пара мест, где у вас есть $("groupinfo-dialog"), когда вы имеете в виду $("#groupinfo-dialog")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...