2012-09-21 10 views
5

Chcę zmienić drugie SelectOneMenu po wybraniu dowolnego elementu z pierwszego SelectOnMenu. Tak jak teraz, otrzymuję wartości dla SelectOneMenus z ManagedBean. Chyba muszę użyć AJAX (jquery), aby wysłać parametry do ManagedBean.Aktualizacja SelectOneMenu innego 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> 

Odpowiedz

8

Właściwie można użyć ValueChangeListener, która jest wywoływana, gdy wartość wprowadzonych zmian selectOneMenu:

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

Następnie w fasoli masz tą metodą:

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

Aby zaktualizować stronę, którą można dodać onchange="submit()" do swojego <h:selectOneMenu/>. Z jakiegoś częściowego renderowania można spróbować dodać ten <f:ajax/> zamiast 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> 

Jeśli się nie mylę będziemy chcieli uzyskać identyfikator elementu wybranego w pierwszym menu i wypełnić drugi według to. Następnie możesz wyrenderować inne selectOneMenu lub, jeśli to konieczne, panel owijający część twojego formularza.

+0

Czy istnieje możliwość wysłania parametru bez zmiennej changeListener? –

+0

Czy możesz, proszę, rozwinąć swój kontekst nieco dalej? Co próbujesz osiągnąć i/lub jakie ograniczenia masz? – Gamb

+0

Dzięki twojemu rozwiązaniu działa teraz dobrze, ale jest w nim mały błąd. Kiedy otwierasz tę stronę po raz pierwszy, nie ma żadnych wartości w 2. SelectOneMenu, ponieważ valueChangedEvent jest wywoływane tylko, jeśli zmienisz wybraną pozycję za pierwszym razem. –

0

ma świetną cechę tego, co próbujesz osiągnąć. Już używa Ajax, więc nie musisz się martwić o pisanie kodu siebie.

+0

Czy mogę użyć podstawowych cech insteaf? Jak mogę wysłać parametry do komponentu bean? –

Powiązane problemy