Oracle DB, Oracle APEX, Linux etc.

Показаны сообщения с ярлыком htmldb_get. Показать все сообщения
Показаны сообщения с ярлыком htmldb_get. Показать все сообщения

понедельник, 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 за этот пост
.


Читать далее

вторник, 15 сентября 2009 г.

ApEx: Асинхронность и часть страницы

Вначале отписал на sql.ru, дублирую здесь.

У htmldb_Get().get второй и третий параметры - теги, которые ограничивают необходимую часть результата (по умолчанию "<!--START-->" и "<!--END-->"). У htmldb_Get().getAsync параметр всего один - функция обратного вызова. А мне нужны и асинхронность, и часть результата, ограниченная определёнными тегами. И поскольку нигде я подобной штуки не нашёл, то сделал сам. Пишу здесь, авось кому-то пригодится.

Итак, у нас есть страница M, в которой будем через AJAX асинхронно обновлять HTML-код региона с id=RESULT_REGION (в принципе, обновлять можем любой не-input DOM-элемент, у которого есть атрибут innerHTML). В качестве содержимого для этого региона берём что-нибудь со страницы N, ограниченное тегами "<!--START_X-->" и "<!--END_X-->".

У htmldb_Get есть метод getPartial, который возвращает часть ответа между двумя тегами (первый и второй параметры метода). Но этот метод работает с полем htmldb_Get.response, которое при вызове GetAsync не заполняется. Поэтому, чтобы не писать собственный Trim для ответов сервера, а использовать уже готовый, надо присваивать этому полю p.response.

Ниже идёт JS-код из заголовка страницы M:
<script type="text/javascript">
var get;

function doIt(){
get = new htmldb_Get(null, $v('pFlowId'),null,N /*Номер страницы с нужным содержимым*/ );
get.GetAsync(f_AsyncReturn);
};

function f_AsyncReturn(){
if (p.readyState==4) {
/*Присваиваем текст ответа нашей переменной get*/
get.response = p.responseText;
/*Присваиваем содержимому нужного элемента часть ответа между двух тегов*/
$x('RESULT_REGION').innerHTML=get.getPartial("", "");
get = null;
}
}
</script>


Полезные ссылки по теме: примеры Карла Бэкстрома по htmldb_Get.get() и htmldb_Get.GetAsync(), описание XMLHttpObject на w3schools.

UPD: Здесь kvad предложил улучшенный вариант, чтобы уйти от возможных проблем с переменной get при множественных асинхронных запросах. Привожу его ниже с небольшими изменениями:

/*В функцию добавлены параметры - регион и страница, которую запрашиваем*/
/*Кроме того, я добавил параметры тегов, с которого и по который считывать страницу*/
function doIt(frame, page, from_tag, to_tag){
var get;
get = new htmldb_Get(null, $v('pFlowId'),null,page);
get.p = get.GetAsync(function(){f_AsyncReturn(get, frame, from_tag, to_tag)});
};

function f_AsyncReturn(get, frame, from_tag, to_tag){
if (get.p && get.p.readyState==4) {
get.response = get.p.responseText;
$x(frame).innerHTML = get.getPartial(from_tag, to_tag);
get = null;
}
}

Читать далее