Вопрос в следующем:
<p:ajax event="select" listener="#{bean.onSelect}" oncomplete="xxx(#{bean.m})" />
Обработчик события select
из выбранного элемента достаёт параметр m
, который после принимает функция xxx
. Но, как вы понимаете, oncomplete
вызывается раньше, и поле m
подтягивается пустым. Как можно решить эту проблему? Можно ли в jsf как то выкинуть руками событие селекта, после чего перейти непосредственно к клиенту? Или есть более элегантные решения?
Ну раз уж используете 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 для извлечения элементов.
Содержимое обработчика 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)" />
Виртуальный выделенный сервер (VDS) становится отличным выбором
Существует готовый написанный графический интерфейс с помощью которого пользователь выбирает директорию для поиска, и вписывает название...
Нужно чтобы SearchView уходила наверх при движении BottomSheet
Всем доброго времени сутокЯ пишу приложение, в котором нужно подключиться к FTP серверу
Не могу понять как сделать выделенный элемент с перетеканием цвета из красного в черныйНужно ли использовать background-image или можно обойтись...