Ajax for valueChangeListener

前端 未结 4 1847
礼貌的吻别
礼貌的吻别 2021-02-05 23:16

I\'m using the p:ajax listener to handle value change events (because valueChangeListener is launched on form submit):



        
相关标签:
4条回答
  • 2021-02-05 23:41

    you can use this:

    public void onNameChanged(AjaxBehaviorEvent event)
     {
        String myVal = (String) ((UIOutput) event.getSource()).getValue();
        System.out.println("myVal: " + myVal);
     }
    
    0 讨论(0)
  • 2021-02-06 00:01

    The problem is, I can't find in AjaxBehaviorEvent nor its class hierarchy the place to read the old value of the input. Neither could I find hint in google, how to get the old value...

    Use a valueChangeListener.


    Unfortunatelly, valueChangeListener is invoked before p:ajax, so I don't have actual data from forms in that method, so in theory I could use valueChangeListener to remember the old value and then wait for p:ajax to process...

    Queue the value change event to the invoke application phase.

    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.
    }
    
    0 讨论(0)
  • 2021-02-06 00:01

    The ValueChangeListener should work this way:

    The view:

    <h:form>
      <h:inputText value="#{sessionBean.hello}" 
                   valueChangeListener="#{sessionBean.valueChangeListener}">
        <p:ajax/>
      </h:inputText>
    </h:form>
    

    The bean:

    public void valueChangeListener(ValueChangeEvent e) {
      System.out.println("valueChangeListener invoked:" 
                          + " OLD: " + e.getOldValue() 
                          + " NEW: " + e.getNewValue());
    }
    

    The above code will print if I change the text field from "hello" to "world":

    valueChangeListener invoked: OLD: hello NEW: world

    0 讨论(0)
  • 2021-02-06 00:04

    You could try the following:

    1. Implement the value change event in your bean

       public void processValueChange(ValueChangeEvent e){
       //foo the bar
       }
      
    2. Define a valueChangeListener on your selection component

       <p:selectOneMenu value="#{yourBean.value}" onchange="submit()" valueChangeListener="{#yourBean.processValueChange}">
      

      The key piece there is the submit() bit that processes the enclosing form on change of the value. You can then getNewValue() and getOldValue() as necessary.

    EDIT: Now that I think about it, I see no reason why you cannot leave your setup as-is and simply define the valueChangeListener. It should still be processed during the change event in the <p:ajax/>, in fact, it will be processed before the listener for the ajax event itself.

    0 讨论(0)
提交回复
热议问题