AJAX-запросы (асинхронный JavaScript и XML) используются в веб-разработке для подгрузки данных с сервера без обновления всей страницы. В Apex нет надобности мучаться с XMLHttpRequest, так как JavaScript API этой среды разработки предоставляет функционал для осуществления таких запросов. Также есть возможность использования jQuery для этих задачь, в действительности функция apex.server.process, о которой пойдёт речь, является враппером этого функционала AJAX-запросов библиотеки, но об этом как-нибудь в другой раз.
AJAX-запрос обращается к серверным процессам и сперва мы поговорим о них. Серверный процесс можно объявить на уровне приложения (Shared Components -> Application Logic -> Application Process), если он будет использоваться в нескольких страницах, или на уровне страницы (Processes -> Execution Options -> Point -> AJAX Callback), и выполняться они будут по запросу (on demand). В качестве источника нужно указать код PL/SQL. В моём примере я просто возвращаю значение переменной APEX_APPLICATION.G_X01 из запроса, если такая имеется, а иначе строку ‘null’.
BEGIN IF APEX_APPLICATION.G_X01 IS NOT NULL THEN HTP.PRN(APEX_APPLICATION.G_X01); ELSE HTP.PRN('null'); END IF; END;
Для выполнения функциии apex.server.process нужно указать идентификатор (название процесса), переменную/переменные и действие, которое должно произойти в случае успешного завершения запроса. В моём примере я обращаюсь к процессу с названием «process_name», передаю переменную x01 со значением «var 1» и функцию, которая выводит всплывающее окно с ответом от сервера. Как я определил в процессе выше, возвращаться будет значение переменной, то есть «var 1». В опции dataType указываем тип данных, которые ожидаем в ответе от сервера (по умолчанию это JSON).
apex.server.process("process_name", { x01: "var 1" }, { dataType: 'text', success: function(response) { alert(response); } } );
Пока запрос выполняется, было бы неплохо, чтобы пользователь понимал, что происходит. В опции apex.server.process можно добавить loadingIndicatorPosition, который будет показывать прогресс в виде «колеса загрузки».
apex.server.process("test", { x01: "var 1" }, { dataType: 'text', success: function(response) { alert(response); }, loadingIndicatorPosition: "page" } );
По умолчанию запрос apex.server.process асинхронный, но его можно сделать синхронным, просто добавив опцию async: false.
apex.server.process("process_name", { x01: "var 1" }, { dataType: 'text', async: false, success: function(response) { alert(response); } } );
На страницах Apex используются так называемые Page Items, это просто элементы (здесь не имеется ввиду HTML) страницы, которые могут содержать разную информацию. Их также можно передавать через AJAX-запросы и напрямую обращаться к ним в серверном процессе. Для следующих примеров нужно изменить процесс, как описано ниже, и тогда он будет возвращать не переменную, а значение Page Item.
BEGIN IF :PAGE_ITEM IS NOT NULL THEN HTP.PRN(:PAGE_ITEM); ELSE HTP.PRN('null'); END IF; END;
Передавать Page Items можно по идентификатору, а разделяя их запятой можно передать сразу несколько таких элементов.
apex.server.process("process_name", { pageItems: "#PAGE_ITEM" }, { dataType: 'text', success: function(response) { alert(response); } } );
Во втором варианте передаются два массива, в первом из которых перечисленны названия элементов, а во втором их значения.
apex.server.process("process_name", { p_arg_names: ["PAGE_ITEM"], p_arg_values: ["var 1"] }, { dataType: 'text', success: function(response) { alert(response); }, } );Понравился пост? Поделись в соцсетях и подписывайся на аккаунты в Twitter и Facebook!