В данный момент я работаю над страницей 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.