2012-09-01 3 views
0

두 개의 oneSelectMenu가 로그인 세부 정보를 기반으로 기본값으로로드 된 다음 두 번째 selectonemenu가 첫 번째 selectonemenu의 onchangeEvent 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 메서드는 매번 DB의 결과를 목록에 채 웁니다. 따라서 아약스 리스너 메소드에서 설정하는 것은 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 덕분에 오해를 제거했습니다. –

관련 문제