2014-02-20 3 views
0

Я столкнулся с проблемой при перезагрузке p: selectOneMenu. В моем личике у меня есть два элемента p: selectOneMenu. Мое требование состоит в том, что если пользователь выбирает что-то из первого p: selectOneMenu, то второй p: selectOneMenu должен перезагружать себя и наоборот.p: selectOneMenu Reset не работает

Ниже приведен код, я использую:

<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 в View Scope. В infoBean.resetCountry()/infoBean.resetState(), я делаю infoBean.infoDataHolder.selectedCountry/infoBean.infoDataHolder.selectedState как null.

Теперь, что происходит, когда я выбираю State, Country 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 из представления, как вы это делаете (#{infoBean.infoDataHolder}), не имеет смысла в JSF, просто доступ к компоненту напрямую.

Здесь у вас есть мой обходной путь:

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

Смотрите также:

Смежные вопросы