2009-09-29 4 views
4

데이터 테이블에 구성 요소의 클라이언트 ID를 가져 오려고합니다. 문제는 JSF 번째 행 (인덱스 = 1)의 링크를 자동적 콤포넌트 ID 전에 즉datatable에서 컴포넌트의 jsf clientid를 얻는 방법은 무엇입니까?

<a id="mappedidentifier_table:1:mappedidentifier_Update" href="#">Update</a> 

을 행 인덱스를두고 있다는 것이다.

내가,

대신

mappedidentifier_table:1:mappedidentifier_Update의, 그러나이

mappedidentifier_table:mappedidentifier_Update 반환 된 ClientID에게

public static String findClientId(String id) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     UIViewRoot view = context.getViewRoot(); 
     if (view == null) { 
      throw new IllegalStateException("view == null"); 
     } 
     UIComponent component = findComponent(view, id); 
     if (component == null) { 
      throw new IllegalStateException("no component has id='" + id + "'"); 
     } 
     return component.getClientId(context); 
    } 

    private static UIComponent findComponent(UIComponent component, String id) { 
     if (id.equals(component.getId())) { 
      return component; 
     } 

     Iterator<UIComponent> kids = component.getFacetsAndChildren(); 
     while (kids.hasNext()) { 
      UIComponent kid = kids.next(); 
      UIComponent found = findComponent(kid, id); 
      if (found != null) { 
       return found; 
      } 
     } 

     return null; 
    } 

를 얻을 수

를 다음과 같은 방법을 사용하고, 따라서 그것은하지 않습니다 일치 id의 행 색인이 누락 된 요소가 누락되었습니다. 내가

http://illegalargumentexception.blogspot.com/2009/05/jsf-using-component-ids-in-data-table.html을 읽은

그러나 내가했던 저자와 같은 간단한 구현보다는 TLD 기능이나 Facelets의를 가질 계획입니다.

아무 생각 없나요?

덕분에,

답변

3

그러나이 mappedidentifier_table:mappedidentifier_Update 대신 mappedidentifier_table:1:mappedidentifier_Update

당신이 행의 컨텍스트 외부 clientId를 해결하는 경우가 발생합니다 반환

dzh. 행 컨텍스트는 UIData 컨트롤을 통해 라이프 사이클의 각 단계마다 설정됩니다.

EL 표현식에서 지연된 평가 대신 즉각적인 평가 - 대신 ${}을 사용하는 경우에도 발생할 수 있습니다. 이 AS

제외하고, 문서에서 언급 한 바와 같이, 그 룩업 알고리즘 만 요소 식별자 뷰에 고유 한 경우 일 것이다; 사양은 NamingContainer에만 유일해야한다고 말합니다. 페이지에서 고유 한 구성 요소 ID를 사용할 때주의가 필요하다면 문제가되지 않습니다.