基于选定的SelectOne菜单项启用jsf组件

基于选定的SelectOne菜单项启用jsf组件,jsf,jsf-2,primefaces,selectonemenu,Jsf,Jsf 2,Primefaces,Selectonemenu,我正在使用jsf/primefaces。我想启用“addState”selectOneMenu下拉菜单如果用户从“addCountry”selectOneMenu中选择“Australia”,它可以工作,但在第一个实例中,您必须在启用前更改国家几次,然后在每次更改时启用/禁用。如何让它在第一次更改后做出响应 <h:outputLabel value="#{bundle.AddressLabel_country}" for="addcountry" /> <p:s

我正在使用jsf/primefaces。我想启用“addState”selectOneMenu下拉菜单如果用户从“addCountry”selectOneMenu中选择“Australia”,它可以工作,但在第一个实例中,您必须在启用前更改国家几次,然后在每次更改时启用/禁用。如何让它在第一次更改后做出响应

    <h:outputLabel value="#{bundle.AddressLabel_country}" for="addcountry" />
    <p:selectOneMenu id="addcountry" value="#{addressBean.address.country}" immediate="true" >
        <f:selectItems value="#{localeList.getCountryList()}" />
        <f:ajax render="addstate"/>
    </p:selectOneMenu>

    <h:outputLabel value="#{bundle.AddressLabel_state}" for="addstate"/>
    <p:selectOneMenu id="addstate" value="#{addressBean.address.state}" disabled="#{addressBean.address.country ne 'Australia'}">
        <f:selectItem itemLabel="Select State" itemValue="" /> 
        <f:selectItems value="#{localeList.getAUState()}" />
    </p:selectOneMenu>
这样怎么样

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class AddressBean implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 2439322307625952605L;

    private List<String> countries;
    private List<String> states;
    private Address address;
    private boolean disableState;
    private Map<String,List<String>> map = new HashMap<String,List<String>>();

    @PostConstruct
    public void init(){
        address= new Address();
        countries = new ArrayList<String>();
        states = new ArrayList<String>();

        countries.add("Australia");
        countries.add("Other");

        String[] s1 = {"state 1","state 2"};
        String[] s2 = {"state 3","state 4"};
        map.put("Australia", Arrays.asList(s1));
        map.put("Other", Arrays.asList(s2));

        this.disableState = "Australia".equals(countries.get(0));
    }

    public void updateState(){
        this.states = map.get(this.address.getCountry());
        this.disableState = "Australia".equals(this.address.getCountry());
    }

    public List<String> getCountries() {
        return countries;
    }

    public void setCountries(List<String> countries) {
        this.countries = countries;
    }

    public List<String> getStates() {
        return states;
    }

    public void setStates(List<String> states) {
        this.states = states;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public boolean isDisableState() {
        return disableState;
    }

    public void setDisableState(boolean disableState) {
        this.disableState = disableState;
    }


}


很好的方法,但不太适合我的代码结构。实际的问题似乎是,由于addressBean.Address.country最初是一个空字符串,事件在分配了一个值之后才被触发,该值随后被更改,这意味着事件在用户第二次选择之前不会被触发。更新:我从第二个Selecomenu中删除了“disabled”(已禁用),因此它总是被呈现,然后在测试时,我也从这个下拉列表中选择了一个选项,如果调用ajax更新,它会重置这个选项,它会这样做。总之,每次都会调用ajax渲染“addState”,只有address.country的值在第二次选择之前不会被更新。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
        <h:form>
            <h:outputLabel value="Country"
                for="addcountry" />
            <p:selectOneMenu id="addcountry" value="#{addressBean.address.country}">
                <f:selectItems value="#{addressBean.getCountries()}" />
                <p:ajax listener="#{addressBean.updateState}" update="addstate"/>
            </p:selectOneMenu>

            <h:outputLabel value="State" for="addstate" />
            <p:selectOneMenu id="addstate" value="#{addressBean.address.state}" disabled="#{addressBean.disableState}">
                <f:selectItem itemLabel="Select State" itemValue="" />
                <f:selectItems value="#{addressBean.getStates()}" />
            </p:selectOneMenu>
        </h:form>
</h:body>
</html>