2012-09-21 10 views
5

Ich möchte das zweite SelectOneMenu aktualisieren, wenn ich ein Element des ersten SelectOnMenu auswähle. Wie es jetzt ist, bekomme ich die Werte für den SelectOneMenus von einem ManagedBean. Ich denke, ich muss AJAX (jquery) verwenden, um Parameter an die ManagedBean zu senden.SelectOneMenu aktualisiert andere 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> 

Antwort

8

Eigentlich können Sie eine ValueChangeListener verwenden, die aufgerufen wird, wenn der Wert Ihrer selectOneMenu Änderungen:

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

Dann in Ihrem Bean Sie diese Methode haben:

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

die Seite aktualisieren Sie kann entweder onchange="submit()" zu Ihrem <h:selectOneMenu/> hinzufügen. Für einige Teilwiedergabe können Sie versuchen, diese Zugabe <f:ajax/> statt 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> 

Wenn mich nicht alles täuscht Sie die ID des Elements im ersten Menü ausgewählt haben möchten und die zweite bevölkern nach es. Dann können Sie das andere selectOneMenu oder, falls erforderlich, ein Panel, das einen Teil Ihres Formulars umschließt, rendern.

+0

Gibt es eine Möglichkeit, den Parameter ohne einen ChangeListener zu senden? –

+0

Kannst du bitte deinen Kontext etwas weiter ausarbeiten? Was versuchen Sie zu erreichen und/oder welche Einschränkungen haben Sie? – Gamb

+0

Mit Ihrer Lösung funktioniert es jetzt gut, aber es ist ein kleiner Fehler drin. Wenn Sie diese Site zum ersten Mal öffnen, gibt es im 2. SelectOneMenu keine Werte, da das valueChangedEvent nur aufgerufen wird, wenn Sie das ausgewählte Element das erste Mal ändern. –

0

Primefaces hat ein großartiges Feature, was Sie erreichen wollen. Es verwendet bereits Ajax, also müssen Sie sich nicht darum sorgen, selbst Code zu schreiben.

+0

Kann ich insteaf primefaces verwenden? Wie kann ich Parameter an die Bean senden? –