Oracle APEX - Как обновить sh IG родительской страницы, если дочерняя модальная диалоговая страница открыта из пользовательской кнопки - PullRequest
0 голосов
/ 09 марта 2020

У меня есть IG на моей странице с настраиваемой кнопкой на панели инструментов, которая открывает страницу модального диалога. Из-за того, как открывается модальное диалоговое окно, для меня не существует способа зафиксировать его закрытие с помощью встроенного Dialog Close.

javascript, который я использую в своем IG для открытия диалога Modla:

            apex.server.process(    
                'GenerateURL',
                {x01: l_url},
                {success: function (pData) {           
                    console.log(pData);
                    // Call Modal Dialog Page
                    apex.navigation.redirect(pData);
                },
                dataType: "text"     
           });

Проблема в том, что после закрытия модального диалога мне нужно обновить sh моего IG. Как я могу получить модальное закрытие диалога с родительской страницы?

1 Ответ

0 голосов
/ 10 марта 2020

Модальные диалоги должны открываться с apex.navigation.dialog. Когда кто-то вызывает apex_util.prepare_url для модальной страницы, он генерирует правильный код JavaScript, который учитывает настройки для целевой страницы.

Существует опция, p_plain_url, которая может использоваться для получения только URL, но не включайте ее в GenerateURL, так как остальное важно. Другой параметр, p_triggering_element, позволяет указать элемент для действия Dynami c (это не вариант с apex_page.get_url, который работает аналогично).

Допустим, GenerateURL выглядело так ( обратите внимание, что я передаю документ как triggeringElement):

declare

  l_url varchar2(512);

begin

  l_url := apex_util.prepare_url(
    p_url                => 'f?p=' || :APP_ID || ':51:' || :APP_SESSION || ':::::P51_ID:' || apex_application.g_x01,
    p_triggering_element => 'document'
  );

  apex_json.open_object();
  apex_json.write('url', l_url);
  apex_json.close_object();

end;

Тогда код JavaScript можно изменить следующим образом:

apex.server.process(    
    'GenerateURL',
    {x01: idForURL},
    {success: function (pData) {           
      var funcBody = pData.url.replace(/^"javascript:/, '').replace(/\"$/,'');

      new Function(funcBody).call(window);
    }
});

Обратите внимание, что JavaScript проходит идентификатор процесса, который генерирует URL, а не весь URL. Это делает использование процесса несколько ограниченным, что помогает пользователям не злоупотреблять им. Можно даже добавить проверку, которая проверяет, что пользователь может просматривать переданное значение идентификатора.

Имея это, вы можете добавить динамическое c действие, прослушивающее диалог Closed событие в document (JavaScript выражение = документ). Обратите внимание, что событие не сработает, если диалоговое окно закрыто с помощью кнопок закрытия или отмены.

...