2012-09-21 31 views
5

Tôi muốn cập nhật SelectOneMenu thứ hai khi tôi chọn bất kỳ mục nào của SelectOnMenu đầu tiên. Như bây giờ, tôi nhận được các giá trị cho SelectOneMenus từ một ManagedBean. Tôi đoán tôi đã sử dụng AJAX (jquery) để gửi các tham số cho ManagedBean.SelectOneMenu cập nhật các SelectOneMenu khác

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

Trả lời

8

Trên thực tế bạn có thể sử dụng một ValueChangeListener được viện dẫn khi giá trị của những thay đổi selectOneMenu của bạn:

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

Sau đó, trong đậu của bạn, bạn có phương pháp này:

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

Để cập nhật các trang web mà bạn có thể thêm onchange="submit()" vào số <h:selectOneMenu/> của bạn. Đối với một số vẽ một phần, bạn có thể thử thêm này <f:ajax/> thay vì 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> 

Nếu tôi không nhầm bạn sẽ muốn nhận được id của phần tử được lựa chọn trong menu đầu tiên và cư trú trong một giây theo nó. Sau đó, bạn có thể hiển thị selectOneMenu khác hoặc, nếu cần, một bảng bao gồm một phần của biểu mẫu của bạn.

+0

Có khả năng gửi tham số mà không có một changeListener không? –

+0

Bạn có thể, xin vui lòng, xây dựng bối cảnh của bạn thêm một chút sau đó? Bạn đang cố gắng đạt được điều gì và/hoặc bạn có hạn chế nào? – Gamb

+0

Với giải pháp của bạn nó hoạt động tốt ngay bây giờ, nhưng có một lỗi nhỏ trong đó. Khi bạn mở trang này lần đầu tiên, không có giá trị trong SelectOneMenu thứ 2, bởi vì valueChangedEvent chỉ được gọi, nếu bạn thay đổi mục đã chọn lần đầu tiên. –

0

Primefaces có tính năng tuyệt vời của những gì bạn đang cố gắng đạt được. Nó đã sử dụng Ajax, vì vậy đừng lo lắng về việc viết mã cho bản thân bạn.

+0

Tôi có thể sử dụng các thủ phạm không chính thức không? Làm cách nào để gửi thông số cho bean? –

Các vấn đề liên quan