2014-02-20 2 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> 

내 백업 콩 InfoBean이 RequestScope에 있으며 infoDataHolder보기 범위에 : 아래

내가 사용하고있는 코드입니다. infoBean.resetCountry()/infoBean.resetState()에서 infoBean.infoDataHolder.selectedCountry/infoBean.infoDataHolder.selectedState를 null로 만들었습니다.

이제 State (상태)를 선택하면 Country p : selectOneMenu가 재설정됩니다. 국가를 선택하면 StateP : 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> 

참조 :

다음

당신은 내 해결 방법을 가지고

관련 문제