基于选定的SelectOne菜单项启用jsf组件
我正在使用jsf/primefaces。我想启用“addState”selectOneMenu下拉菜单如果用户从“addCountry”selectOneMenu中选择“Australia”,它可以工作,但在第一个实例中,您必须在启用前更改国家几次,然后在每次更改时启用/禁用。如何让它在第一次更改后做出响应基于选定的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
<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>