2013-10-28 7 views
4

내 자신의 트리 구성 요소를 작성하려고합니다. 모든 것이 예상대로 작동하지만 h:outputText 반복적으로 동일한 ID를 가져옵니다 - 너무 좋아, 지금까지NamingContainer는 어떻게 구현합니까? 모든 자식이 동일한 클라이언트 ID를 얻습니다.

<my:tree id="extendedTree" 
     value="#{controller.rootNode}" 
     var="node"> 
    <h:outputText id="xxx" value="#{node.name}" /> 
    <h:commandLink value="Test" actionListener="#{controller.nodeSelectionActionListener}" /> 
</my:tree> 

를 : 트리 노드는 예를 들어, 트리 구성 요소의 사업부 포함 된 자식 요소로 렌더링합니다.
그래서 난 내 구성 요소가 getContainerClientId()을 덮어 javax.faces.NamingController을 구현했다 :

@Override 
public String getContainerClientId(FacesContext context) { 
    String clientId = super.getClientId(context); 
    String containerClientId = clientId + ":" + index; 
    return containerClientId; 
} 

index는 노드에 걸쳐 반복하는 동안 설정 및 업데이트됩니다. 그러나 getContainerClientId()은 모든 어린이에게 단 한 번만 호출됩니다 (모든 반복 및 모든 어린이를위한 것은 아닙니다.). 즉 모든 아동의 ID가 같은 컨테이너 ID로 시작되도록 :

form:treeid:0:xxx 

같은 일을 getClientId()을 덮어 쓰기.

무엇을 놓쳤습니까?

+0

나의 겸허 한 탄원은 Curaçao에 간다. 누군가 대답을 알고 있는가? :) – Zeemee

답변

5

대답은 JSF 1.2 specification의 장 3.1.6의 맨 아래에 숨겨져 :

3.1.6 클라이언트 식별자

... 값이 메서드에서 반환

이이어야합니다 setId()이 호출되지 않는 한 구성 요소 인스턴스의 수명이 동일합니다.이 경우 getClientId()으로 다음 호출에서 다시 계산됩니다.이 경우 이 다시 계산됩니다. UIComponentBase#getClientId() 구현 (또한 line 275 as it is in Mojarra 1.2_15에서 NullCheck를 참조) UIComponentBase#setId()를 호출 할 때이 캐시가 resetted 될 때 즉

getClientId()의 결과는 JSF 구성 요소에 의해 캐시 디폴트로 (또한 line 358 as it is in Mojarra 1.2_15 참조). 캐시 된 클라이언트 ID를 재설정하지 않으면 모든 getClientId() 호출에서 동일한 값이 반환됩니다. 그래서

구성 요소 또는 아마도 다음과 같이한다 렌더러의 encodeChildren() 구현,

for (UIComponent child : getChildren()) { 
    child.encodeAll(context); 
} 

에서 아이들을 렌더링하는 동안, 당신은 모든 어린이의를 다시 UIComponent#getId()의 결과로 UIComponent#setId()를 호출해야한다

for (UIComponent child : getChildren()) { 
    child.setId(child.getId()); 
    child.encodeAll(context); 
} 

<h:dataTable> 구현 뒤에 UIData 클래스가 수행 내부적으로 아이를 인코딩하기 전에 클라이언트 ID를 캐시 그건 그렇고 (참조 : line 1382 as it is in Mojarra 1.2_15). 이것은 JSF 1.x에만 해당되는 것이 아니라 JSF 2.x에도 동일하게 적용됩니다 (또한 Facelets <ui:repeat> 뒤에있는 UIRepeat 클래스에도 적용됨).

-1

h : outputText id는 동적으로 만들지 않은 것과 동일하게 제공합니다. 다음과 같이 만들 수 있습니다 :

<h:outputText id="xxx_#{node.id}" value="#{node.name}" /> 

노드에 고유 한 'id'속성이 있다고 가정합니다.

+0

내 구성 요소는 다른 NamingContainers (예 : UIData)의 동작을 복제해야합니다. 행 ID (내 경우 인덱스)가 자동으로 접두어로 사용되므로 ID를 동적으로 만들 필요가 없습니다. – Zeemee

+0

이것은 절대적으로 효과가 없을 것입니다. ''은 명확하게 UI 컴포넌트이고 태그 핸들러는 아닌 반면 뷰 속성 생성시 ID 속성이 평가됩니다. 실제로 다시 작성하지 않고 답변을 게시하지 말고 로컬 샌드 박스 환경에서 문제를 해결하십시오. – BalusC

+0

@BalusC 감사합니다. 그렇다면 어떻게 될까요? – Zeemee