2012-09-21 7 views
5

Desidero aggiornare il secondo SelectOneMenu quando seleziono qualsiasi elemento del primo SelectOnMenu. Come è ora, ottengo i valori per SelectOneMenus da un ManagedBean. Suppongo di dover usare AJAX (jquery) per inviare parametri al ManagedBean.SelectOneMenu aggiorna altro SelectOneMenu

<h:form> 
    <div class="center"> 
     <h:panelGrid id="editTable" columns="2" styleClass="center"> 
      ... 
      <h:outputText value="#{msg.timetable_list_category}" /> 
      <h:selectOneMenu class="category"> 
       <f:selectItems value="#{categoryBackingBean.categorys}" var="c" 
        itemLabel="#{c.category_Name}" itemValue="#{c.id}" /> 
      </h:selectOneMenu> 

       <h:outputText value="#{msg.timetable_list_seminarblock}" /> 
      <h:selectOneMenu class="seminarblock"> 
       <f:selectItems value="#{seminarblockBackingBean.seminarblocks}" var="s" 
        itemLabel="#{s.seminarblock_Name}" itemValue="#{s.seminarblock_Id}" /> 
      </h:selectOneMenu> 
      ... 
     </h:panelGrid> 
     ... 
    </div> 
</h:form> 

risposta

8

In realtà è possibile utilizzare un ValueChangeListener che viene invocato quando il valore delle modifiche selectOneMenu:

<h:selectOneMenu class="category" valueChangeListener="#{yourBean.selectOneMenuListener}"> 
    <f:selectItems value="#{categoryBackingBean.categorys}" var="c" 
     itemLabel="#{c.category_Name}" itemValue="#{c.id}" /> 
</h:selectOneMenu> 

Poi, nel vostro fagioli avete questo metodo:

public void selectOneMenuListener(ValueChangeEvent event) { 
    //This will return you the newly selected 
    //value as an object. You'll have to cast it. 
    Object newValue = event.getNewValue(); 
    //The rest of your processing logic goes here... 
} 

Per aggiornare la pagina puoi aggiungere onchange="submit()" al tuo <h:selectOneMenu/>. Per alcuni rendering parziale si può provare ad aggiungere questo <f:ajax/> invece di onchange="submit()":

<h:selectOneMenu class="category" valueChangeListener="#{yourBean.selectOneMenuListener}"> 
    <f:selectItems value="#{categoryBackingBean.categorys}" var="c" 
     itemLabel="#{c.category_Name}" itemValue="#{c.id}" /> 
    <f:ajax event="change" execute="@form" render="theIdOfTheComponentYouWantToReRender"/> 
</h:selectOneMenu> 

Se non sbaglio si vorrà ottenere l'id dell'elemento selezionato nel primo menu e popolare la seconda in base alla esso. Quindi puoi rendere l'altro selectOneMenu o, se necessario, un pannello che avvolge una parte del tuo modulo.

+0

Esiste la possibilità di inviare il parametro senza un changeListener? –

+0

Puoi, per favore, elaborare il tuo contesto un po 'più avanti? Cosa stai cercando di ottenere e/o quali restrizioni hai? – Gamb

+0

Ora con la tua soluzione funziona bene, ma c'è un piccolo bug in esso. Quando apri questo sito per la prima volta, non ci sono valori nel secondo SelectOneMenu, poiché il valore ValueChangedEvent viene chiamato solo se si modifica l'elemento selezionato la prima volta. –

0

Primefaces ha una grande caratteristica di ciò che si cerca di raggiungere. Usa già Ajax, quindi non devi preoccuparti di scrivere codice in modo autonomo.

+0

Posso utilizzare primefile di insteaf? Come posso inviare parametri al bean? –

Problemi correlati