В этом посте я собираюсь сосредоточиться на методе 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 после действия кнопки и действия прослушивателя действия.
Давайте рассмотрим пример очень простого потока задач:
Существует два вида просмотра: 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 метод управляемого компонента, определенный в прослушивателе сервера, будет в любом случае выполняться на
Стадия применения значений запроса .
Это оно!