2011-12-06 10 views
12

Utilizzo dell'istantanea PF 3.0-RC1 (22/11/2011)Come posso ottenere PrimeFaces <p: selectOneMenu> per chiamare valueChangeListener?

Possiedo un componente composito. Voglio chiamare il valoreChangeListener quando viene effettuata una selezione, ma non sembra che stia chiamando il listener.

ecco il codice per il componente:

<p:selectOneMenu style="width: 220px;" 
     value="#{customerProfileSessionBean.selectedAccount}" 
     valueChangeListener="#{customerProfileSessionBean.accountValueChange}" > 
    <f:selectItems value="#{sessionBean1.custAccountList}"/> 
</p:selectOneMenu> 

L'ascoltatore nel backing bean ha un'istruzione di stampa che non viene chiamato (almeno io non lo vedo nel registro del server).

C'è qualcos'altro che devo fare per ottenere il valoreChangeListener da chiamare quando il valore cambia? Devo usare?

Inoltre, nel listener c'è un ValueChangeEvent che viene passato?

Grazie.

risposta

34

Sembra che ti aspetti che il metodo valueChangeListener sul lato server venga chiamato immediatamente quando si verifica un evento di modifica sul lato client. Questo non è corretto. Sarà invocato solo quando il modulo è inviato al server e il nuovo valore non è il equals() vecchio valore.

Ci sono almeno due modi per raggiungere il vostro requisito funzionale:

  1. Aggiungi onchange="submit()" modo che JavaScript presenterà sotto forma ogni volta che si cambia il valore:

    <p:selectOneMenu style="width: 220px;" 
        value="#{customerProfileSessionBean.selectedAccount}" 
        valueChangeListener="#{customerProfileSessionBean.accountValueChange}" 
        onchange="submit()"> 
        <f:selectItems value="#{sessionBean1.custAccountList}"/> 
    </p:selectOneMenu> 
    

    Questo è comunque molto JSF -1.x-ish e scarso per l'esperienza utente. Inoltre invierà (e convertirà/convalida!) Tutti gli altri campi di input che potrebbero non essere ciò che desideri.

  2. Utilizzare un listener Ajax, di sicuro se non si è interessati alla modifica del valore effettivo (vale a dire il vecchio valore non è interessante per te), ma in realtà sei interessato all'evento di modifica stesso. È possibile farlo utilizzando <f:ajax> o nei componenti primefaces utilizzando <p:ajax>:

    <p:selectOneMenu style="width: 220px;" 
        value="#{customerProfileSessionBean.selectedAccount}"> 
        <p:ajax listener="#{customerProfileSessionBean.accountValueChange}" /> 
        <f:selectItems value="#{sessionBean1.custAccountList}"/> 
    </p:selectOneMenu> 
    

    e sostituire l'argomento ValueChangeEvent dall'argomento AjaxBehaviorEvent.

+0

Grazie. Stavo aspettando che il componente PrimeFaces eseguisse submit() come parte del comportamento dell'ajax del componente. – Burferd

+6

La tua soluzione di selcond ha funzionato molto bene per essere, ma solo se ho cambiato ' devsnd

+1

BalusC è perfetto.Ancora più divertente, anche se non sono sicuro che sia legittimo, è sufficiente inserire all'interno del menu e lasciare intatto l'attributo valueChangeListener del menu. Per qualche motivo, ajax genererà valueChangeEvent quando l'elemento cambia. Ho provato questo in modo esauriente per apportare un cambiamento immediato a un locale e funziona un sogno. –

3

Add f: dichiarazione ajax per p: selectOneMenu, creerà chiamata AJAX e verrà inviato il valore EX:

 <p:selectOneMenu style="width: 220px;" value="# 
     {customerProfileSessionBean.selectedAccount}" 
      valueChangeListener="#{customerProfileSessionBean.accountValueChange}" > 
     <f:selectItems value="#{sessionBean1.custAccountList}"/> 
     <f:ajax render="@form"/> 
     </p:selectOneMenu> 

Oppure si può fornire pannello id o id DataTable, se non voglio torender l'intero modulo, come:

<f:ajax render=":formid:panelGroupId"/> 
Problemi correlati