2012-09-21 32 views
5

Quiero actualizar el segundo SelectOneMenu cuando selecciono cualquier elemento del primer SelectOnMenu. Tal como está ahora, obtengo los valores para SelectOneMenus de ManagedBean. Supongo que tengo que usar AJAX (jquery) para enviar parámetros a ManagedBean.SelectOneMenu updates other 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> 

Respuesta

8

En realidad se puede utilizar un ValueChangeListener que se invoca cuando el valor de los cambios selectOneMenu:

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

Luego, en el bean que tiene este método:

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... 
} 

Para actualizar la página puede agregar onchange="submit()" a su <h:selectOneMenu/>. Por alguna prestación parcial puede intentar añadir esta <f:ajax/> en lugar de 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> 

Si no me equivoco usted querrá obtener el id del elemento seleccionado en el primer menú y poblar el segundo uno según eso. Luego puede renderizar el otro selectOneMenu o, si es necesario, un panel que envuelva una parte de su formulario.

+0

¿Existe la posibilidad de enviar el parámetro sin un changeListener? –

+0

¿Puede, por favor, elaborar su contexto un poco más allá? ¿Qué estás tratando de lograr y/o qué restricciones tienes? – Gamb

+0

Con su solución funciona bien ahora, pero hay un pequeño error en él. Cuando abre este sitio por primera vez, no hay valores en el 2nd SelectOneMenu, porque el valueChangedEvent solo se llama, si cambia el elemento seleccionado la primera vez. –

0

Primefaces tiene una gran característica de lo que se trata de lograr. Ya está usando Ajax, por lo que no tiene que preocuparse por escribir código usted mismo.

+0

¿Puedo usar insteaf primefaces? ¿Cómo puedo enviar parámetros al bean? –

Cuestiones relacionadas