Oracle ADF > Contextual Events > Обновление компонентов на форме при выполнении ViewObject


Абузим то, что при событии, фреймворк сам обновляет компонент.


Происходит событие.

Во ViewObject передаются данные и он изменяется или он просто вызывается.
Появляется необходимость рефрешить форму.

Вариант с использованием partialPageRendering не подходит, т.к. используются разные регионы.

В общем всем рекомендую попробовать. И каждый раз, кгода будет выполняться execute VO. Результаты будут обновляться в приложении.


Декларативный вариант

Смотрим у компоенента в property inspector поле “Contextual Events”.

Если нет, отправляемся к варианту 2.

Если есть, просто добавляем с каким-нибудь именем.
При этом в bindings должен создаться eventBinding –> events –> myEvent

Далее, если событие должно происходить, делаем следующий финт. Меняем созданный jdeveloper actionListener, тем который был у нас.

Добавляем в метод updateComponetnByEventBinding(); который приводится в шаге 2.

====

Далее

Заходим в Bindings страницы где находится компонент который нужно рефрешить, создаем Action с ссылкой на этот VO (Например Execute).

Переходим в Contextual Events.

Subscribers –> и добавляем созданное.


Вариант 2

Есть компонент, в котором происходит событие:

Например такой

<af:commandMenuItem text="SOME TEXT" id="cmi7"
    actionListener="#{MyBean.onSelect}">


Шаг 1

Нахожу этот компонент. Правой конокой мыши, Go To Page Definition.

Если скажет, что ее нет, то создать.

Далее в bindings создать eventBinding

В структуре кликнуть на созданный eventBinding –> Insert Inside eventBinding. Выбрать events.

В Левом нижнем углу появилась структура в которой есть eventBinding.

Правой кнопкой мыши по events –> Insert Inside events. Выбрать event и задать ему какое-нибудь удачное названиет. (Например, “eventBinding”)


Добавляю к стандартному событию еще вот это:


import oracle.adf.model.BindingContext;
import oracle.jbo.uicli.binding.JUEventBinding;
import oracle.adf.model.binding.DCBindingContainer;
import oracle.adf.model.events.EventDispatcher;


public void onSelect (ActionEvent actionEvent) {

    updateComponetnByEventBinding();

    // SOME OTHER LOGIC

}


eventBinding - это то как вы назвали event


private void updateComponetnByEventBinding(){
    JUEventBinding eventBinding =
       (JUEventBinding) BindingContext.getCurrent().getCurrentBindingsEntry().get("eventBinding");
    System.out.println("eventBinding = " + eventBinding);

    EventDispatcher eventDispatcher =
       ((DCBindingContainer) BindingContext.getCurrent().getCurrentBindingsEntry()).getEventDispatcher();
    System.out.println("eventDispatcher = " + eventDispatcher);
    eventDispatcher.queueEvent(eventBinding, null);
}


Шаг 2

В Bindings страницы где привязан наш VO.

Должен быть создан Action со ссылкой на VO. Если нет, создать.

(Выбираю Execute моего VO)

Перешхожу на вкладку Contextual Events.

Далее вкладка Subscribers.

Добавить:

Нахожу наш event, добавляю Publisher и Handler.

Сохраняю.

Все.