我有两个oneSelectMenu加载了基于登录详细信息的默认值,然后第二个selectonemenu应该根据第一个selectonemenu的onchangeEvent菜单加载值。我试图在onchange事件之前清除默认值但是值仍然不适用于onchange事件
<h:selectOneMenu id="blS" value="#{BoardAction.serviceAreaId}" >
<f:ajax event="valueChange" render="blSearchFacilityInput" listener="#{BoardAction.svaValueChangeEvent}"/>
<f:selectItems value="#{BoardAction.serviceAreaList}" var="c" itemLabel="#{c.svaCode}" itemValue="#{c.id}"/> </h:selectOneMenu>
<h:selectOneMenu id="blSearchFacilityInput" value="#{BoardAction.facilityId}"> <f:ajax event="valueChange" render="blSearchSectorInput" listener="#{BoardAction.facValueChangeEvent}"/>
<f:selectItems value="#{BoardAction.svaFaciltyList}" var="c" itemLabel="#{c.facCode}" itemValue="#{c.id}"/></h:selectOneMenu>
ActionBean:
private List<FacilityEBean> svaFaciltyList=null;
public List<FacilityEBean> getSvaFaciltyList() {
svaFaciltyList = facilityBusServ.getFacilityListBySVAId(session.getLoginUser());
return svaFaciltyList;
}
public List<FacilityEBean> svaValueChangeEvent(){
if(svaFaciltyList!=null){
svaFaciltyList.clear();
svaFaciltyList=null;
}
svaFaciltyList = facilityBusServ.getFacilityList(Integer.parseInt(serviceAreaId));
return svaFaciltyList;
}
答案 0 :(得分:1)
您的代码逻辑流程错误。您似乎期望输入组件以某种方式直接绑定到属性,并且ajax操作侦听器方法可以返回(更改)属性值。因此实际上并非如此。
例如,EL表达式#{BoardAction.serviceAreaList}
实际上为该属性调用 getter 方法。在您的特定情况下,getter方法每次都会使用DB的结果填充列表。因此,无论你在ajax监听器方法中设置什么,每次都会被getter方法中的业务逻辑覆盖。
那些getter方法应该不包含业务逻辑。您需要按如下方式重写代码:
private List<FacilityEBean> svaFaciltyList;
@PostConstruct
public void init() {
svaFaciltyList = facilityBusServ.getFacilityListBySVAId(session.getLoginUser());
}
public void svaValueChangeEvent() {
svaFaciltyList = facilityBusServ.getFacilityList(Integer.parseInt(serviceAreaId));
}
public List<FacilityEBean> getSvaFaciltyList() {
return svaFaciltyList;
}