首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >p:selectOneMenu重置无效

p:selectOneMenu重置无效
EN

Stack Overflow用户
提问于 2014-02-20 08:22:02
回答 2查看 1.8K关注 0票数 0

我面临着重置p:selectOneMenu的问题。在我的面部,我有两个p:selectOneMenu项目。我的要求是,如果用户从第一个p:selectOneMenu中选择什么,那么第二个p:selectOneMenu应该重置自己,反之亦然。

下面是我使用的代码:

代码语言:javascript
复制
<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设为空。

现在发生的事情是,当我选择国家时,国家p:selectOneMenu被重新审查。但是选择国家,国家p:选择,getting没有被重新审查。你能帮帮我吗。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-20 12:15:42

您可能希望更新选择一个菜单的父组件,如

代码语言:javascript
复制
 <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
EN

Stack Overflow用户

发布于 2014-02-20 12:27:21

我看不出你在选择一个州时需要重新设定国家名单的意义。我认为,这里的适当行为是允许最终用户在每个国家内选择一个国家。这是通过加载每个国家的相关状态并呈现依赖的h/p:selectOneMenu来实现的。

我不鼓励您为此使用两种不同的bean,只需使用@ViewScoped即可。另外,从视图中访问瞬态JSF (#{infoBean.infoDataHolder})在JSF中没有意义,只是直接访问bean。

这是我的解决办法:

代码语言:javascript
复制
@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;
    }

}
代码语言:javascript
复制
<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>

还请参见:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21902009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档