2014-02-20 35 views
0

我在重置p:selectOneMenu時遇到問題。在我的facelet中,我有兩個p:selectOneMenu項。我的要求是,如果用戶從第一個p:selectOneMenu中選擇了某些內容,則第二個p:selectOneMenu應該自行重置,反之亦然。p:selectOneMenu重置不起作用

下面是我使用的代碼:

<p:outputLabel for="country" value="Country:" /> 
<p:selectOneMenu id="country" effect="none" 
    value="#{infoBean.infoDataHolder.selectedCountry}"> 
    <f:selectItem itemLabel="Select One" itemValue="" 
     noSelectionOption="true" /> 
    <f:selectItems 
     value="#{infoBean.infoDataHolder.availableCountries}" 
     var="aCountry" itemLabel="#{aCountry.description}" 
     itemValue="#{aCountry.description}" /> 
    <p:ajax update="state" 
     listener="#{infoBean.resetState()}" /> 
</p:selectOneMenu> 

<p:outputLabel for="state" value="State:" /> 
<p:selectOneMenu id="state" effect="none" 
    value="#{infoBean.infoDataHolder.selectedState}"> 
    <f:selectItem itemLabel="Select One" itemValue="" 
     noSelectionOption="true" /> 
    <f:selectItems 
     value="#{infoBean.infoDataHolder.availableStates}" 
     var="aState" itemLabel="#{aState}" 
     itemValue="#{aState}" /> 
    <p:ajax update="country" 
     listener="#{infoBean.resetCountry()}" /> 
</p:selectOneMenu> 

我支持bean InfoBean是RequestScope和infoDataHolder在查看範圍。 在infoBean.resetCountry()/ infoBean.resetState()中,我將infoBean.infoDataHolder.selectedCountry/infoBean.infoDataHolder.selectedState設置爲null。

現在發生的事情是,當我選擇國家時,國家p:selectOneMenu正在重新設置。但選擇國家,州p:selectOneMenu沒有得到重置。 你能幫我在這裏嗎。謝謝。

回答

1

您可能想更新選擇一個菜單的父組件一樣

<p:panel id="panel_"> 
     <p:selectOneMenu id="country" ... 
     <p:ajax update="panel_" listener="#{infoBean.resetState()}" /> 
     </p:selectOneMenu> 
     <p:selectOneMenu id="state" ... 
     <p:ajax update="panel_" listener="#{infoBean.resetCountry()}" /> 
     </p:selectOneMenu> 
</p:panel> 
0

我看不到你的選擇狀態時,正在重置的國家列表的需求點。在我看來,這裏的正確行爲是允許最終用戶在每個國家內選擇一個國家。這是通過加載每個國家的相關狀態並渲染相關的h/p:selectOneMenu來完成的。

我不鼓勵你爲此使用兩種不同的豆子,只需要使用@ViewScoped。從視圖中訪問瞬態JSF管理的bean(#{infoBean.infoDataHolder})在JSF中沒有意義,只是直接訪問bean。

在這裏,你有我的解決方法:

@ManagedBean 
@ViewScoped 
public class InfoDataHolder { 

    private List<String> availableCountries = Arrays.asList("USA", 
      "Switzerland"); 

    private List<String> availableStates = new ArrayList<String>(); 

    private String selectedCountry; 

    private String selectedState; 

    public void countrySelected() { 
     if ("USA".equals(selectedCountry)) { 
      availableStates = Arrays.asList("Arizona", "California"); 
     } else if ("Switzerland".equals(selectedCountry)) { 
      availableStates = Arrays.asList("Zurich", "Bern"); 
     } else { 
      availableStates = new ArrayList<String>(); 
     } 
    } 

    public List<String> getAvailableCountries() { 
     return availableCountries; 
    } 

    public List<String> getAvailableStates() { 
     return availableStates; 
    } 

    public String getSelectedCountry() { 
     return selectedCountry; 
    } 

    public String getSelectedState() { 
     return selectedState; 
    } 

    public void setSelectedCountry(String selectedCountry) { 
     this.selectedCountry = selectedCountry; 
    } 

    public void setSelectedState(String selectedState) { 
     this.selectedState = selectedState; 
    } 

} 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:f="http://xmlns.jcp.org/jsf/core"> 
<h:head /> 
<h:body> 
    <h:form> 
     <h:selectOneMenu value="#{infoDataHolder.selectedCountry}"> 
      <f:selectItem noSelectionOption="true" itemLabel="Choose a Country" /> 
      <f:selectItems var="country" 
       value="#{infoDataHolder.availableCountries}" itemValue="#{country}" /> 
      <f:ajax listener="#{infoDataHolder.countrySelected}" 
       render="state_selection" /> 
     </h:selectOneMenu> 
     <h:selectOneMenu value="#{infoDataHolder.selectedState}" 
      id="state_selection"> 
      <f:selectItem noSelectionOption="true" itemLabel="Choose an State" /> 
      <f:selectItems value="#{infoDataHolder.availableStates}" var="state" 
       itemValue="#{state}" /> 
     </h:selectOneMenu> 
    </h:form> 
</h:body> 
</html> 

參見: