Элемент страницы Oracle APEX, установленный в обратном вызове ajax, не сохраняется

В моем обратном вызове ajax (PL / SQL) есть следующий код:

:P1_CNT := TO_NUMBER(:P1_CNT) + 1;
apex_util.set_session_state
     (p_name  => 'P1_CNT'
     ,p_value => :P1_CNT
     );

Что, кажется, работает нормально. Но затем вызывается процесс, который проверяет этот элемент страницы, и этот элемент страницы отображается как 0, хотя в обратном вызове он установлен на 1. Как я могу это исправить?

Код, вызывающий ajax, - это javascript ниже, выполняемый из настраиваемого динамического действия:

for ( var i=0; i<records.length; i++) {
        apex.server.process
            ("my_ajax_callback"
            ,{x01:records[i][1]}
            ,{type:'GET', dataType: 'text', success: function( text) {}}
            );
}


apex.page.submit( 'COMPLETE_PROCESS_RECORDS' );

Где COMPLETE_PROCESS_RECORDS - это процесс, который выполняется после того, как все записи в цикле были обработаны обратным вызовом ajax. обратный вызов ajax оценивает каждую переданную ему запись, обрабатывает одни и отбрасывает другие. P1_CNT увеличивается каждый раз при дальнейшей обработке записи.


person Coding Duchess    schedule 10.12.2019    source источник
comment
Вызов apex_util.set_session_state не требуется. При выполнении PL / SQL APEX сначала идентифицирует переменные связывания и устанавливает их из состояния сеанса перед выполнением кода. Затем, после выполнения, он увидит, изменились ли какие-либо значения, и, если да, автоматически отобразит их обратно в постоянное состояние сеанса.   -  person Dan McGhan    schedule 10.12.2019


Ответы (1)


Вы не показали нам код, который вызывает обратный вызов Ajax, но в основном это серверный (PL / SQL в данном случае) и клиентский (JavaScript) код. Чтобы сервер мог получать значения со стороны клиента, вы должны отправить их при вызове обратного вызова Ajax. Для этого нужен параметр pData: https://docs.oracle.com/en/database/oracle/application-express/19.2/aexjs/apex.server.html#.process

Вы можете получить доступ к значениям, которые вы отправляете в код на стороне сервера, по-разному в зависимости от того, как вы их отправляете. Например, если вы отправляете значение с x01, вы можете ссылаться на него в своем коде PL / SQL с помощью apex_application.g_x01.

Конечно, иногда вам нужно получить значения со стороны сервера на сторону клиента. Для этого обычно вы отправляете HTTP-ответ из своего кода PL / SQL. Вот пример, который отправляет объект JSON:

apex_json.open_object();
apex_json.write('hello', 'world');
apex_json.close_object();

Затем вам нужно будет обновить код на стороне клиента, чтобы просмотреть и использовать ответ HTTP для сопоставления значений с любой частью страницы / DOM, которая вам нужна.

Это настолько типично, что команда APEX сделала это очень простым, если вы используете платформу Dynamic Action вместо необработанного JavaScript. Есть действие «Выполнить PL / SQL», которое имеет атрибуты с именами Элементы для отправки и Элементы для возврата, которые могут сделать за вас тяжелую работу.

Выполнить PL / SQL

person Dan McGhan    schedule 10.12.2019
comment
ajax вызывается из javascript из настраиваемого динамического действия. Я добавил код в вопрос - person Coding Duchess; 11.12.2019
comment
Есть несколько проблем с отображаемым вами кодом. 1) Вы зацикливаетесь на вызовах apex.server.process. Это плохо, потому что вы потенциально делаете много ненужных циклов обращения к базе данных, когда вместо этого вы можете сделать только один вызов. 2) Пока цикл является синхронным, вызовы apex.server.process - нет, поэтому вы закончите отправку страницы до того, как все вызовы apex.server.process завершатся. Если есть ошибки, вы никогда о них не узнаете. Обычно вы хотите вызвать apex.page.submit в обратном вызове success вызова Ajax (если он был) - person Dan McGhan; 11.12.2019
comment
Я не могу вызвать отправить страницу, так как не все записи были обработаны. Какие у меня есть альтернативы? - person Coding Duchess; 11.12.2019
comment
Мне нужно лучше понять, что вы пытаетесь сделать, прежде чем я смогу помочь. Этот вопрос начался с элемента страницы, установленного в обратном вызове ajax, не сохраняется, но очевидно, что здесь мы идем в другом направлении. Опишите, что показывает эта страница, что вы обрабатываете с помощью JavaScript, почему вам нужно отображать значения обратно на страницу из процесса Ajax, почему вам нужно отправить страницу и т. Д. Когда я лучше понимаю, что вы пытаясь сделать, я могу предложить, как это сделать лучше всего. - person Dan McGhan; 11.12.2019