Как вызвать event у jsf?

228
30 июня 2017, 05:49

Вопрос в следующем:

<p:ajax event="select" listener="#{bean.onSelect}" oncomplete="xxx(#{bean.m})" />

Обработчик события select из выбранного элемента достаёт параметр m, который после принимает функция xxx. Но, как вы понимаете, oncomplete вызывается раньше, и поле m подтягивается пустым. Как можно решить эту проблему? Можно ли в jsf как то выкинуть руками событие селекта, после чего перейти непосредственно к клиенту? Или есть более элегантные решения?

Answer 1

Ну раз уж используете Primefaces, то можете выполнить javascript из своего обработчика

...
public void onSelect(SelectEvent event) {
    setM(event.getObject());
    RequestContext.getCurrentInstance().execute("xxx(" + getM() +")");
}
...

Таким нехитрым образом скрипт будет передан клиенту для исполнения. Что случится, понятное дело, после завершения обработки.

И ещё. oncomplete вызывается не раньше обработчика, а после. https://stackoverflow.com/questions/20146630/execution-order-of-events-when-pressing-primefaces-pcommandbutton
Проблема только в том, что m действительно имеет старое значение, которое у неё было во время отрисовки страницы. А вновь выбранное m таким образом в скрипт не передать.

Если не нужна обработка выбора на сервере, то можно посмотреть клиентское api компонента. Может там предусмотрены клиентские события и api для извлечения элементов.

Answer 2

Содержимое обработчика oncomplete заполняется раньше, чем появляется актуальное значение поля m, а если точнее, EL-выражение обрабатывается в момент отрисовки компонента (rendering), а не в момент срабатывания события "select".

Варианты решения данной проблемы зависят от конкретной цели. Возможно нет надобности получать из бина поле m, и выполнить все в onSelect методе бина.

Если же на стороне клиента все-таки необходимо получить данные из бина, то следует разместить на странице h:inputHidden / h:outputText со ссылкой на требуемое поле, и обновлять его после события. Значение поля будет доступно на момент вызова скрипта oncomplete, останется только получить это значение с помощью javascript.

<h:outputText id="someStringDataId" 
              value="#{bean.m}" 
              binding="#{someStringData}" />
...
<p:ajax event="select" 
        listener="#{bean.onSelect}" 
        update="someStringDataId"
        oncomplete="xxx(document.getElementById('#{someStringData.clientId}').textContent)" />
READ ALSO
Многопоточность с использованием fork() и join()

Многопоточность с использованием fork() и join()

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

150
Behavior. Зависимость SearchView от BottomSheet

Behavior. Зависимость SearchView от BottomSheet

Нужно чтобы SearchView уходила наверх при движении BottomSheet

206
Не выводятся названия файлов с сервера в listview

Не выводятся названия файлов с сервера в listview

Всем доброго времени сутокЯ пишу приложение, в котором нужно подключиться к FTP серверу

153
Как сделать перетекание цвета в меню как на картинке?

Как сделать перетекание цвета в меню как на картинке?

Не могу понять как сделать выделенный элемент с перетеканием цвета из красного в черныйНужно ли использовать background-image или можно обойтись...

289