Oracle DB, Oracle APEX, Linux etc.

понедельник, 5 октября 2009 г.

ApEx: обновление переменных в сессии без сабмита

Частенько так бывает, что нужно воспользоваться новым значением элемента на странице в скриптах или запросах без сабмита этой страницы. Например, обновить интерактивный отчёт или простой PPR-отчёт, выполнить процесс по требованию etc. Чтобы значение переменной, соответствующей этому элементу, изменилось в сессии, есть пара приёмов.

Чтобы ассинхронно обновить значение переменной в JavaScript, можно воспользоваться классом apex.ajax.ondemand:

/* Сохранить в сессии значение элемента асинхронно */
function saveThisItemAsync(p){
/* создаём пустой вызов к БД - без имени процесса и callback-функции */
var aget = new apex.ajax.ondemand();
/* добавляем нашу переменную-элемент */
aget.ajax.add(p.id, $v(p));
aget._get();
}


Для синхронного обновления можно воспользоваться им же, просто вызвав ajax.get(). :) Вот JS-функция для синхронного обновления значения переменной в сессии:

/* Сохранить в сессии значение элемента */
function saveThisItem(p){
var get = new apex.ajax.ondemand();
get.ajax.add(p.id, $v(p));
get.ajax.get();
}


Если кто-то хочет посмотреть, что там внутри apex.ajax.ondemand находится - пожалуйста:

apex.ajax = {
...
ondemand : function (pWidget,pReturn){
var that = this;
this.ajax = new htmldb_Get(null,$x('pFlowId').value,'APPLICATION_PROCESS='+pWidget,0);
this._get = _get;
this._set = _set;
this._return = !!pReturn?pReturn:_return;
return;
function _get(pValue){
that.ajax.GetAsync(that._return);
}
function _set(pValue){}
function _return(pValue){}
}
}

Таким образом, всё, что можно делать с htmldb_Get, можно делать и с apex.ajax.ondemand. Просто иногда короче. :)
Спасибо за информацию для размышления и написания этого поста kvad на sql.ru: Oracle APEX за этот пост
.

2 комментария:

  1. Скажите пожалуйста, а как получить значение item из session state в javascript?

    ОтветитьУдалить
  2. Если элемент (item) находится на текущей странице, то можно создать Dynamic Action, который будет выполнять PL/SQL-код, и указать у него в Page Items to Return этот элемент. Тогда значение на странице после срабатывания DA обновится.

    Если нужно просто получить значение элемента, или элемент находится на другой странице, то придётся создавать процесс On Demand с вызовом apex_util.get_session_state и обращаться к нему через AJAX: apex.ajax.ondemand, htmldb_Get. Процессу можно передавать имя элемента как параметр, так что хватит одного процесса на всё приложение.

    ОтветитьУдалить