2012-09-01 60 views
0

我有兩個oneSelectMenu加載基於登錄詳細信息,然後第二個基於第一selectOneMenu用於的onchangeEvent selectOneMenu用於應加載值默認值menu.i試圖清除onchange事件前的默認值,但遺體值並且不能與onchange事件一起使用。H:selectOneMenu用於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

你的代碼邏輯流程是錯誤的。您似乎期望輸入組件以某種方式直接綁定到屬性,並且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; 
} 
+0

非常感謝@ BalusC,它清除了我的誤解。 –