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);
 }