Oracle APEX каскадные текстовые поля с автозаполнением - PullRequest
0 голосов
/ 26 марта 2020

В данный момент я работаю над страницей Oracle APEX, которая представляет форму ввода (она отправляется путем выполнения функции JavaScript, а не самой страницей отправки), и среди других элементов есть три элемента которые отображаются в виде текстовых полей с автозаполнением и должны соответствовать следующим логам c: первый P100_ ROOT, второй P100_BRANCH и зависит от P100_ ROOT, а третий - P100_LEAF , который зависит как от P100_ ROOT, так и от P100_BRANCH . Кроме того, мне нужно, чтобы эти элементы работали следующим образом:

  • , когда все элементы равны нулю, P100_BRANCH и P100_LEAF отключены;
  • когда P100_ ROOT не равно нулю, а остальные равны нулю, тогда P100_LEAF отключено;
  • при P100_ ROOT и P100_BRANCH не равны NULL, тогда они отключены, а P100_LEAF - нет.

Чтобы элементы следовали этой логике c Я настроил настройки полей следующие:

  • «Ленивая загрузка» установлена ​​на «Да» для P100_BRANCH и P100_LEAF и на «Нет» для P100_ ROOT соответственно;
  • «Родительские элементы каскадного LOV» установлены на «P100_ROOT» для P100_BRANCH и на «P100_ ROOT, P100_BRANCH» для P100_LEAF соответственно;
  • ”Элементы страницы для отправки” установлены для элементов P100_BRANCH и P100_LEAF для них lves;
  • Для параметра «Оптимизировать обновление» установлено значение «Нет» для всех элементов.

Также я написал JavaScript функцию toggleCascadeItems , которая принимает «Число», соответствующее идентификатору элемента (вы можете увидеть его в этом посте ниже) и связанное с событием каждого элемента «onBlur». Однако я обнаружил трудности с выполнением этой задачи. Во-первых, события «onBlur» и «onChange» запускаются для текстовых полей с автозаполнением, когда пользователь просто выбирает любое значение из всплывающего списка, но не тогда, когда оно действительно записывается в поле. Во-вторых, возможно, есть еще одно событие, которое срабатывает даже после рефреса элемента sh (я имею в виду событие apexrefresh), и из-за этого элементы P100_ ROOT, P100_BRANCH и P100_LEAF не работают должным образом: я имею в виду, что все логи c выполняются, но затем что-то происходит с некоторыми элементами, чтобы избавиться от атрибута «disabled», и это не из-за toggleCascadeItems .

Чтобы решить мою проблему, я пробовал такие вещи как:

  • переписывание функции JavaScript toggleCascadeItems ( Я знаю, что его код является избыточным, но он предназначен только для обхода события «apexrefresh» и связывания его не только с «onBlur» / «onChange», но и с событием «apexrefresh» (подробнее см. Код ниже) информация);
  • избавление от «Элементы страницы для отправки» и сохранение значений вышеупомянутых элементов в сеансе с помощью процедуры PL / SQL APEX_UTI L.SET_SESSION_STATE;
  • изменение P100_BRANCH и P100_LEAF из текстовых полей с автозаполнением для выбора списков.

И никто из них мне не помог чтобы атрибут «disabled» исчез. Я попытался найти информацию, касающуюся моей проблемы, но у меня ничего не получилось.

Вот функция JavaScript toggleCascadeItems :

function toggleCascadeItems(nMode){
  var page = 'P' + $v('pFlowStepId') + '_';
  if (nMode == 0) //p100_root
  {
      if ($("#" + page + "ROOT").val() == ''){
        $("#" + page + "ROOT").removeAttr('disabled');
        $("#" + page + "BRANCH").attr('disabled','true');
        $("#" + page + "LEAF").attr('disabled','true');
      } else {
        if ($("#" + page + "BRANCH").val() == ''){
          $("#" + page + "ROOT").removeAttr('disabled');
          $("#" + page + "BRANCH").removeAttr('disabled');
          $("#" + page + "LEAF").attr('disabled','true');
        } else {
          $("#" + page + "ROOT").attr('disabled','true');
          if ($("#" + page + "LEAF").val() == ''){
            $("#" + page + "BRANCH").removeAttr('disabled');
            $("#" + page + "LEAF").removeAttr('disabled');
          } else {
            $("#" + page + "BRANCH").attr('disabled','true');
          }
        }
      }
  }
  else if (nMode == 1) //p100_branch
  {
      if ($("#" + page + "BRANCH").val() == ''){
        $("#" + page + "ROOT").removeAttr('disabled');
        $("#" + page + "LEAF").attr('disabled','true');
        if ($("#" + page + "ROOT").val() == ''){
          $("#" + page + "BRANCH").attr('disabled','true');
        } else {
          $("#" + page + "BRANCH").removeAttr('disabled');
        }
      } else {
        $("#" + page + "ROOT").attr('disabled','true');
        $("#" + page + "LEAF").removeAttr('disabled');
        if ($("#" + page + "LEAF").val() == ''){
          $("#" + page + "BRANCH").removeAttr('disabled');
        } else {
          $("#" + page + "BRANCH").attr('disabled','true');
        }
      }
  }
  else if (nMode == 2) //p100_leaf
  {
      if ($("#" + page + "LEAF").val() == ''){
        if ($("#" + page + "ROOT").val() == ''){
          $("#" + page + "ROOT").removeAttr('disabled');
          $("#" + page + "BRANCH").attr('disabled','true');
        } else {
          $("#" + page + "BRANCH").removeAttr('disabled');
          if ($("#" + page + "BRANCH").val() == ''){
            $("#" + page + "ROOT").removeAttr('disabled');
          } else {
            $("#" + page + "ROOT").attr('disabled','true');
          }
        }
      } else {
        $("#" + page + "ROOT").attr('disabled','true');
        $("#" + page + "BRANCH").attr('disabled','true');
      }
  }
  //console.log(nMode);
  //alert(nMode);
}

И это некоторый код из «Выполнено при загрузке страницы»:

  $("#P100_ROOT,#P100_BRANCH,#P100_LEAF").each(function(){
   $(this).bind('apexafterrefresh',function(event){
     var sID = $(this).attr('id');
     var nMode = ((sID == "P100_ROOT") ? 0 : (sID == "P100_BRANCH") ? 1 : (sID == "P100_LEAF") ? 2 : -1);
     toggleCascadeItems(nMode);
     //console.log('refresh ' + sID);
   });
   $(this).on('blur',function(event){
     var sID = $(this).attr('id');
     var nMode = ((sID == "P100_ROOT") ? 0 : (sID == "P100_BRANCH") ? 1 : (sID == "P100_LEAF") ? 2 : -1);
     toggleCascadeItems(nMode);
     //console.log('change ' + sID);
   });
  });

ps Я использую Oracle APEX 4.2.6.00.03, а также у меня есть два необходимых условия: P100_ ROOT должен оставаться в текстовом поле с автозаполнением ( P100_BRANCH и P100_LEAF могут быть списками выбора), и форма все еще должна быть отправлена ​​путем выполнения функции JavaScript.

...