Гость
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Обновление любой страницы приложения по закрытию модального окна в APEX 19.1 / 6 сообщений из 6, страница 1 из 1
05.06.2019, 08:27
    #39822605
fenix89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление любой страницы приложения по закрытию модального окна в APEX 19.1
Опишу проблему с которой я столкнулся и решение которой нашел в итоге (путем проб и ошибок).

Стояла следующая задача. Организовать смену ролей при помощи простой формы (выбор роли из выпадающего списка и кнопка "Применить"). В старой версии ПО форма представляла обычную (не модальную) страницу, и по сабмиту происходил возврат на "Home Page". После обновления апекса до 19.1 возникла задача реализовать это дело в окне диалога. Самая соль в том что вызываться этот диалог должен с любой страницы приложения (в моем случае из "Navigation Bar"). Поэтому реализация динамического действия на событие закрытия диалога в родительской странице не имела смысла (или нужно было делать это для каждой страницы приложения).

Решение которое пришло на ум - отлавливать событие закрытие диалога в глобальной странице. Для этого:

1. Определил в диалоговом окне DA по нажатию кнопки "применить"
Код: javascript
1.
2.
apex.submit({request:'changeRole'});
apex.navigation.dialog.close(true,{dialogPageId:'20'}); //20 - идентификатор страницы диалога

сам процесс changeRole представляет собой PLSQL процедуру с некоторыми манипуляциями с БД, точка вызова "Processing"

2. В Global Page был определено DA по отлавливанию закрытия именно этого диалога

When

Event: Dialog Closed
Selection Type: Javascript Expression
JavaScript Expression: window

Client-side Condition

Type: Javascript Expression
Javascript Expression:
Код: javascript
1.
this.browserEvent.type == "apexafterclosedialog" && this.data.dialogPageId == "20"


True Action : ... А тут самое интересное.

Событие срабатывало, но не происходило обновления нужных частей страницы, зависимых от примененной роли. Что только не пробовал прописывать в "True action": submit, refresh, принудительные клики по лого приложения, переход по window.location.href. При этом если просто нажимал f5 - то все срабатывало и обновлялось.

Так бы и бился о стену - пока однажды не поставил в "True action" перед одним из методов обновления вызов alert. И чудо - все заработало. После скрытия сообщения - все элементы нормально обновлялись согласно выбранной роли. Но такая штука совершенно не воспринималась Firefox. Понял, что что-то не так на уровне процесса смены роли, будто закрытие диалога начинает происходить параллельно с выполнением процесса а не после. Поэтому решил попробовать конструкцию Ajax. Определил точку вызова процесса как "Ajax Callback" и переопределил DA на нажатие кнопки следующим образом:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
apex.server.process('changeRole',
        {
	x01: $v('P20_ROLE')
        },
	{
	       dataType:'text',
	       success:function(pData){
                     apex.navigation.dialog.close(true,{dialogPageId:'20'});
	       },
	       error:function(request,status,error){
			   alert(error);
	       },
	       loadingIndicatorPosition: "page"
	}
);


И все прекрасно заработало. Потребность в алертах отпала. Работает как на IE так и на Firefox.

Надеюсь данная информация будет полезна. Если этот метод не рационален и есть более оптимальные подходы к реализации данной задумки, буду рад услышать.
...
Рейтинг: 0 / 0
05.06.2019, 09:10
    #39822622
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление любой страницы приложения по закрытию модального окна в APEX 19.1
fenix89Надеюсь данная информация будет полезна.
Спасибо! Конечно полезно, недавно бились над похожей проблемой и в итоге не решили.
...
Рейтинг: 0 / 0
05.06.2019, 09:28
    #39822632
blkangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление любой страницы приложения по закрытию модального окна в APEX 19.1
Я не однократно писал на этом форуме, изучите асинхронное програмирование, хотя бы прочитайте ЧТО ЭТО.
И тогда у Вас не будет таких длинных статей и проблем.
...
Рейтинг: 0 / 0
05.06.2019, 17:59
    #39823014
Migelle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление любой страницы приложения по закрытию модального окна в APEX 19.1
blkangel,
Это легко говорить, задним числом, когда уже установлено, что проблема в асинхронности. Но сначала надо выявить, что причина именно в ней, а это не всегда очевидно.
...
Рейтинг: 0 / 0
06.06.2019, 01:07
    #39823166
fenix89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление любой страницы приложения по закрытию модального окна в APEX 19.1
Migelle Но сначала надо выявить, что причина именно в ней, а это не всегда очевидно.
Да, вы правы. Изначально была проблема без видимых ассоциаций с асинхронным программированием.

blkangelЯ не однократно писал на этом форуме, изучите асинхронное програмирование, хотя бы прочитайте ЧТО ЭТО.
Что такое асинхронное программирования я более менее знаю, правда применял его в других областях.

blkangelИ тогда у Вас не будет таких длинных статей и проблем.
Ничего похожего, именно касательно описанной проблемы на форуме не встречал. Поэтому решил описать последовательно. Тот же код перехвата закрытия диалога с глобальной страницы - находил нечто подобное на стороннем ресурсе, но в другой форме, и она мне не подошла. При помощи отладчика составил такую конструкцию, вдруг кому сэкономит время. Поэтому тут нечто более чем познания в области АП.
...
Рейтинг: 0 / 0
06.06.2019, 09:22
    #39823232
blkangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление любой страницы приложения по закрытию модального окна в APEX 19.1
Как только речь идет о DA+pl/sql или ajax, вы должны понимать, что по умолчанию это асинхронный вызов.
Oracle позаботился о разработчиках, и сделал тумблер Wait For Result, который ждет выполнения pl/sql и только потом производит дальнейщие действия.
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Обновление любой страницы приложения по закрытию модального окна в APEX 19.1 / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]