h:SelectOneMenu onchange事件不起作用

时间:2012-09-01 16:32:13

标签: jsf-2 onchange selectonemenu

我有两个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;

    }

1 个答案:

答案 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;
}