Ajax для valueChangeListener
Я использую прослушиватель p:ajax
для обработки событий изменения значения (потому что valueChangeListener
запущен в форме submit):
<p:ajax event="change" listener="#{bean.onNameChanged}"/>
Метод обработки:
public void onNameChanged(final AjaxBehaviorEvent event)
Проблема заключается в том, что я не могу найти в AjaxBehaviorEvent
и иерархии его классов место для чтения старого значения ввода. Я также не мог найти подсказки в google, как получить старую ценность...
Как получить доступ к старому значению в событии p:ajax onChange
?
Ответы
Ответ 1
Проблема заключается в том, что я не могу найти в AjaxBehaviorEvent или его иерархии классов место для чтения старого значения ввода. Я также не мог найти подсказки в google, как получить старую ценность...
Используйте valueChangeListener
.
Unfortunatelly, valueChangeListener вызывается перед p: ajax, поэтому у меня нет фактических данных из форм в этом методе, поэтому теоретически я мог бы использовать valueChangeListener для запоминания старого значения, а затем ждать p: ajax для обработки..
Очередь события изменения значения в фазу вызова приложения.
public void valueChangeListenerMethod(ValueChangeEvent event) {
if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
event.queue();
return;
}
// Do your original job here.
// It will only be invoked when current phase ID is INVOKE_APPLICATION.
}
Ответ 2
Функция ValueChangeListener должна работать следующим образом:
Вид:
<h:form>
<h:inputText value="#{sessionBean.hello}"
valueChangeListener="#{sessionBean.valueChangeListener}">
<p:ajax/>
</h:inputText>
</h:form>
bean:
public void valueChangeListener(ValueChangeEvent e) {
System.out.println("valueChangeListener invoked:"
+ " OLD: " + e.getOldValue()
+ " NEW: " + e.getNewValue());
}
Вышеприведенный код будет напечатан, если я изменил текстовое поле с "привет" на "мир":
valueChangeListener invoked: OLD: hello NEW: world
Ответ 3
Вы можете попробовать следующее:
-
Внесите событие изменения значения в bean
public void processValueChange(ValueChangeEvent e){
//foo the bar
}
-
Определите valueChangeListener
для вашего компонента выбора
<p:selectOneMenu value="#{yourBean.value}" onchange="submit()" valueChangeListener="{#yourBean.processValueChange}">
Ключевым элементом является бит submit()
, который обрабатывает прилагаемую форму при изменении значения. Вы можете затем getNewValue()
и getOldValue()
по мере необходимости.
EDIT: теперь, когда я думаю об этом, я не вижу причин, по которым вы не можете оставить свою установку как есть, и просто определите valueChangeListener
. Он все равно должен обрабатываться во время события change
в <p:ajax/>
, на самом деле он будет обработан перед слушателем для самого события ajax.
Ответ 4
вы можете использовать это:
public void onNameChanged(AjaxBehaviorEvent event)
{
String myVal = (String) ((UIOutput) event.getSource()).getValue();
System.out.println("myVal: " + myVal);
}