Статьи

Лица АПД.

В этом посте я собираюсь сосредоточиться на методе ADF Faces Javascript API для запуска пользовательского события со стороны клиента. Например:

1
2
3
4
   function cliListener(actionEvent) {
     AdfCustomEvent.queue(actionEvent.getSource(), "servListener",
                        null, true);
    }

Мы можем использовать тег af: clientListener , чтобы присоединить функцию cliListener к командной кнопке и вызывать функцию при каждом нажатии кнопки. На стороне сервера мы можем перехватить событие и вызвать метод управляемого компонента:

1
2
3
4
5
     <af:commandButton text="TestButton" id="cb1" action="goEdit">  
      <af:clientListener type="action" method="cliListener" />
      <af:serverListener type="servListener"
                         method="#{TheBean.serverListener}"/>
    </af:commandButton>

Вопрос в том, на какую фазу жизненного цикла будет доставлено это событие и на какой фазе будет запущен метод управляемого бина? Иногда это очень важно, потому что это может значительно изменить поведение приложения.

Давайте посмотрим на спецификацию метода AdfCustomEvent.queue :

01
02
03
04
05
06
07
08
09
10
11
/**
 * @param {AdfUIComponent} Component to queue the custom event on
 * @param {String} the type of the event
 * @param {Object} a set of parameters to include on the event.  Reserved
 *    parameter names include "type" and "immediate".
 * @param (boolean) whether the custom event is "immediate" - which will
 *  cause it to be delivered during Apply Request Values on the server,
 *  or not immediate, in which case it will be delivered during
 *  Invoke Application.
 */
AdfCustomEvent.queue = function(component, type, params, immediate) { ... }

Я собираюсь сосредоточиться на непосредственном параметре. Когда его значение равно true , клиентское событие будет доставлено на этапе применения значений запроса . Таким образом, он будет запускаться до действия командной кнопки и методов прослушивателя действий, которые будут запускаться на этапе вызова приложения . И если значение непосредственного параметра равно false , то клиентское событие будет запускаться на этапе приложения Invoke после действия кнопки и действия прослушивателя действия.

Давайте рассмотрим пример очень простого потока задач:

Снимок экрана 2014-01-28 в 1.52.58 вечера

Существует два вида просмотра: BrowseView и EditView . У каждого из них есть файл PageDef. BrowseView содержит TestButton, который описан выше. Эта кнопка запускает действие goEdit , поэтому, когда пользователи щелкают по нему, они переходят к действию EditView . Кроме того, нажатие кнопки также вызывает JS-функцию cliListener , которая отправляет пользовательское событие servListener на сервер. Это событие будет перехвачено, и будет вызван метод управляемого компонента:

1
2
3
4
5
6
7
   
 public void serverListener(ClientEvent clientEvent) {
  BindingContext bc = BindingContext.getCurrent();
  DCBindingContainer dcb = (DCBindingContainer) bc.getCurrentBindingsEntry();
  //Do something with dcb
  System.out.println("dcb="+dcb.getName());
}

Если мы установим значение непосредственного параметра в true в коде JS

1
2
3
4
   function cliListener(actionEvent) {
     AdfCustomEvent.queue(actionEvent.getSource(), "servListener",
                        null, true);
    }

затем метод serverListener будет вызван на этапе Apply Request Values перед переходом в EditView . Имя текущего контейнера привязки будет выглядеть так:

1
..._pageDefs_BrowseViewPageDef_...

Но если непосредственный параметр равен false, то метод serverListener будет вызван после действия кнопки, и имя текущего контейнера привязки будет выглядеть так:

1
..._pageDefs_EditViewPageDef_...

Пример приложения для этого поста требует JDeveloper R2.

Запись! Это все выше в этом посте хорошо для R2.

В R1 поведение немного отличается. Если действие командного компонента вызывает переход к другому действию представления (как в нашем случае) и клиентское событие ставится в очередь с немедленным = false, то метод управляемого компонента, определенный в прослушивателе сервера, никогда не будет вызываться. Но если вы останетесь в той же операции представления, то метод управляемого компонента будет выполняться на этапе Invoke Application .

В случае немедленного = true метод управляемого компонента, определенный в прослушивателе сервера, будет в любом случае выполняться на
Стадия применения значений запроса .

Это оно!

Ссылка: Лица АПД. Немедленные пользовательские события от нашего партнера JCG Евгения Федоренко в блоге ADF Practice .