2012-05-15 4 views
2

저는 primefaces 3.2를 사용하고 있습니다.primefaces uiViewRoot 내부에서 구성 요소 찾기 <p : dataTable>

나는 다음과 같은 상황이있어 :

<h:form id="someForm"> 
    .. 
    <p:dataTable id="someDataTable" value="#{BackingBean.list}" var="element" ..> 
    <p:column> 
     <p:calendar id="someCalendar" value=#{element.date} ../> 
     <p:message id="someCalendarMessage" for=":someForm:someDataTable:someCalendar"/> 
    <p:column> 
    </p:dataTable>  
    .. 
</h:form> 

은 "someDataTable"동적으로 업데이트됩니다 후 모든 데이터가 서버 측에 제출됩니다. 백킹 빈에서, 입력 된 날짜가 어떤 조건을 만족시키지 않으면 캘린더 "someCalendar"에 대한 메시지를 보내려고합니다. 이 코드를 사용하여 구성 요소를 찾아보십시오 :

내가 데이터 테이블에서 "요소"의 인덱스
FacesContext facesContext = FacesContext.getCurrentInstance(); 
facesContext.addMessage(facesContext.getViewRoot().findComponent(":someForm:someDataTable:" + "i" + ":someCalendar").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, Utils.getResourceBundleString("dictionary", "error") + ":", Utils.getResourceBundleString("dictionary", "some_message"))); 
return; 

되는 BackingBean에있는 목록에서 인덱스와 동일.

facesContext.getViewRoot(). findComponent (..) 메서드가 구성 요소를 찾을 수 없으므로 NullPointerException이 발생하는 문제는보기에서 달력의 생성 된 ID를 확인했지만 : someForm : someDataTable : 0 : 첫 번째 요소의 someCalendar이며 다음 요소 여야합니다. someForm : someDataTable : 1 : 다음 요소의 someCalendar 등

왜 facesContext.getViewRoot(). findComponent (..) 메서드는 내부 요소를 찾을 수없는 이유는 무엇입니까? ? 업데이트가 동적으로 업데이트되고 제출이 완료된 후 서버 측에서 업데이트 된 구성 요소 트리를 가져 오지 못했을 수 있습니까? 사전에

감사합니다.

답변

3

이것은 p:dataTable이 반복 구성 요소이며보기 작성 중보기 루트에 하나의 달력 만 있기 때문입니다. ID는 someForm:someDataTable:someCalendar입니다.

뷰 렌더링 동안 만 테이블 행이 만들어지고 행 종속적 ID가 생성됩니다.

당신은 사용해야

JSF 구축 된 검증 시설 날짜 확인 : 뷰에서

:

<p:calendar id="someCalendar" value=#{element.date} 
      validator="#{BackinBean.validateDate}"/> 
<p:message id="someCalendarMessage" for="someCalendar"/> 

합니다 (for 속성의 someCalendar 충분)

및 후원의를 콩 :

public void validateDate(
       FacesContext context, 
       UIComponent component, 
       Object value) throws ValidatorException { 

     if (/* date is not valid */) { 
      throw new ValidatorException(
       new FacesMessage("Date is not valid")); 
     } 

} 

Th 유효성 검증 메소드의 FacesMessage가 자동으로 올바른 테이블 행에 표시됩니다.

+4

이 상황에서 교차 필드 유효성 검사가 불가능하다는 것을 의미합니까? –

관련 문제