p:selectOneMenu重置不起作用

时间:2014-02-20 08:22:03

标签: jsf-2 primefaces selectonemenu

我在重置p:selectOneMenu时遇到问题。在我的facelet中,我有两个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位于View Scope中。 在infoBean.resetCountry()/ infoBean.resetState()中,我将infoBean.infoDataHolder.selectedCountry / infoBean.infoDataHolder.selectedState设为null。

现在发生的事情是,当我选择State时,Country p:selectOneMenu正在重置。但是选择国家,州p:selectOneMenu没有被重置。 你能帮帮我吗?感谢。

2 个答案:

答案 0 :(得分: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>  

答案 1 :(得分:0)

在选择州时,我无法确定您是否需要重新设置国家/地区列表。在我看来,这里的正确行为是允许最终用户在每个国家/地区内选择一个州。这是通过加载每个国家/地区的相关状态并渲染从属h/p:selectOneMenu来完成的。

我不鼓励你为此使用两个不同的bean,只需使用@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>

另见: