2015-11-02 68 views
0

在我的項目中,我需要幫助解決這個常見問題。如何在缺少ajax支持時正確使用selectOneMenu onchange事件?

我想刷新值的列表list2根據當前在另一個列表中選擇的值list1使用我的類bean中的方法,我還想使用Ajax而不是加載整個頁面。 rerender酒店在selectOneMenu中不可用。

我曾嘗試:

 <h:selectOneMenu id="list1" value="#{bean.currentSelectedObject1}" onchange="submit()" 
     valueChangeListener="#{bean.methodAct}"> 

     <f:selectItems value="#{bean.listObjects1}" /> 
     </h:selectOneMenu> 

應該更新菜單:

 <h:selectOneMenu id="list2" value="#{bean.currentSelectedObject2}"> 

     <f:selectItems value="#{bean.listObjects2}" /> 
     </h:selectOneMenu> 

我不知道是否可以使用一些RichFaces的標籤來做到這一點,或者如果有另一種方法。

UPDATE:

建議的解決方案給我一個錯誤:<a4j:ajax> Tag Library supports namespace: http://richfaces.org/a4j, but no tag was defined for name: ajax 我可以看到a4j:ajaxListener只有type屬性,但沒有a4j:ajax,也沒有任何形式的f:ajax,我已經看過here,但我使用JSF 2.2而不是JSF 2.0

謝謝

+0

所以,你使用過時的JSP視圖技術,而不是它的後繼者的Facelets?這完全解釋了爲什麼''不適合你。它僅在Facelets中可用,而不在JSP中。放棄JSP並遷移到Facelets。尋求解決方法是徒勞的。 – BalusC

+0

非常感謝@BalusC,通過簡單地將文件重命名爲* .xhtml,我能夠找到''! – TiMr

回答

1

下面的代碼刷新在第一列表改變事件第二個列表(選擇例如在許多列表,但它是選擇一個列表相同的機制。另外,如果有選擇的在第一個列表超過1項,第二個是空的):

<h:panelGrid columns="1" border="0" cellpadding="0" cellspacing="0"> 
    <h:outputLabel value="#{msg.clients}" for="clientList" styleClass="boldlabel"> 
     <span class="required">*</span> 
    </h:outputLabel> 
    <h:selectManyListbox id="clientList" 
     value="#{reportForm.selectedProviderIds}" 
     label="#{msg.client}" size="8" 
     style="min-width:120px;" 
     valueChangeListener="#{reportForm.providerSelectionChanged}" 
     immediate="true" 
     required="true"> 
     <f:selectItems value="#{reportForm.providerList.list.list}" 
      var="client" 
      itemLabel="[#{client.providerCode}] #{client.name}" 
      itemValue="#{client.providerId}" /> 
     <a4j:ajax event="change" render="retailerList, programList" /> 
    </h:selectManyListbox> 
</h:panelGrid> 

<h:panelGrid columns="1" border="0" cellpadding="0" cellspacing="0"> 
    <h:outputLabel value="#{msg.retailers}" 
     for="retailerList" styleClass="boldlabel" /> 
    <h:selectManyListbox id="retailerList" 
     value="#{reportForm.selectedRetailerIds}" 
     label="#{msg.retailer}" size="8" 
     style="min-width:120px;" 
     valueChangeListener="#{reportForm.retailerSelectionChanged}" 
     immediate="true"> 
     <f:selectItems value="#{reportForm.retailers.list.list}" 
      var="item" 
      itemLabel="[#{item.retailerCode}] #{item.name}" 
      itemValue="#{item.retailerId}" /> 
     <a4j:ajax event="change" render="programList" /> 
    </h:selectManyListbox> 
</h:panelGrid> 

而Java:

/** 
* Reaction on selection in client list box 
* @param event - Value change event with new value of selected clients 
*/ 
public void providerSelectionChanged(ValueChangeEvent event) { 
    setSelectedProviderIds((Long[])event.getNewValue()); // sets new value(s) and clean related 
    cleanClientRelatedComponents(); 
} 

/** 
* Clean up source for client related UI components 
*/ 
private void cleanClientRelatedComponents() { 
    retailers = null; // needed for rebuild retailers 
    setSelectedRetailerIds(null); // clean up retailer related source of data inside 
} 

/** 
* Sets selected retailer IDs and clean up source for related components 
* @param selectedRetailerIds the selectedRetailerIds to set 
*/ 
public void setSelectedRetailerIds(Long[] selectedRetailerIds) { 
    this.selectedRetailerIds = selectedRetailerIds; 
    if (selectedRetailerIds != null && selectedRetailerIds.length == 1) { 
     setSelectedRetailerId(selectedRetailerIds[0]); 
    } else { 
     setSelectedRetailerId(0); // rebuild list 
    } 
}