2011-11-16 3 views
2

다른 이름 지정 컨테이너 내에서 일부 JSF 구성 요소를 처리 할 수 ​​있습니다.다른 이름 지정 컨테이너의 구성 요소 주소 지정

Useecase : 복합 구성 요소에서 정의 된 필드에 대해 일부 기능을 캡슐화하는 복합 구성 요소.

일부 코드 :

<form id="foo"> 
... 
<label for="nameTxt">Name:</label> 
<component:customError forField="nameTxt" /> 
<h:inputText id="nameTxt" /> 
... 
</form> 

및 구성 요소 : 내가 생각

Could not render Message. Unable to find component 'nameTxt' (calling findComponent on component 'j_id963445801_469fc056:errorMsg') 

나는 문제가 이해 :

<composite:implementation> 
    <h:panelGroup id="errorComponent"> 
    ... 
    <h:message for="#{cc.attrs.forField}" id="errorMsg" style="display:none;" /> 
    ... 
    </h:panelGroup> 
</composite:implementation> 

문제는 메시지를 렌더링에 내가 얻을 수 있다는 것입니다 사실 "nameTxt"필드와 "errorMsg"메시지는 다른 명명 컨테이너에 있습니다. 그래서 내가해야 할 일은 공통 조상과 관련하여 "nameTxt"의 경로/id를 지정하는 것입니다.

알고리즘을 공부 한 후 UIComponentBase:findComponent 루트 (예 : ": foo : ... : nameTxt")에서 전체 (절대) id-path를 지정하는 것보다 교차 명명 컨테이너를 직접 찾는 방법이 실제로 표시되지 않습니다. . 그리고 이것은 페이지 구조를 변경 한 후에 오류가 발생하기 쉬울뿐만 아니라 서투른 모양입니다.

- 어떻게 "nameTxt"라는 필드를 복합 컴포넌트의 메시지에서 올바르게 처리 할 수 ​​있습니까?

+0

사용중인 JSF impl/version은 무엇입니까? 나는 Mojarra 2.1.4에서 이것을 재현 할 수 없다. – BalusC

+0

그것은 MyFaces 2.1.2입니다. 하지만 잘못하지 않았다면 findComponent의 해상도 알고리즘에서 직접 가져옵니다. 따라서 여기서 또 다른 접근법이 필요합니다. 그러나 그것은 당신을 위해 작동합니까? 즉, 명명 컨테이너 경로가없는 일반 ID 만 사용하여 다른 구성 요소를 참조 할 수 있습니까? –

답변

1

MyFaces 2.1.3에서는 문제를 재현 할 수 있지만 Mojarra 2.1.4에서는 문제가 재현 될 수 있습니다 (이전 Mojarra 2.0.2에서는 발생하지 않음). MyFaces의 버그 일 가능성이 높습니다. MyFaces guys에 신고해야합니다. 그 사이에 Mojarra의 JSF 구현을 (일시적으로) 대체하는 것 외에는 다른 옵션이 없습니다. 그러나 문제의 자체 몫을 가지고 있는데, 주로 깨진 <ui:repeat>과 부분적인 상태 저장 구현을 가지고 있습니다.


업데이트 : 나는 그것이 그러나의 서투른 조금, 해결 방법을 발견

<component:customError forField=":#{nameTxt.clientId}" /> 
<h:inputText id="nameTxt" binding="#{nameTxt}" /> 

이 상대적 클라이언트 ID 대신 절대 클라이언트 ID를 사용하여 조회 할 것이다. 다른 문제를 해결하기 위해 <h:message>에서 style="display:none" 만 제거하면됩니다.

+0

해결 방법 : "바인딩"은 의미가 있습니까? 모든 구성 요소가 명명 컨테이너가 아닌 경로에서 작동하는지 여부는 확실하지 않습니다. 클라이언트 경로에 모든 구성 요소가 있고 알고리즘이 명명 컨테이너의 ID로만 작동한다는 것을 의미합니다. –

+0

구현의 차이점 - 힌트를 주셔서 감사합니다. 현재로서는 나에게 불가능합니다. Mojarra에서 어떤 경로 (정체성이없는) 또는 일부 일반적인 조상에서 출발하는 경로가없이 어떻게 작동합니까? –

+0

정말로 의미가 있습니다. 그렇지 않으면 해결 방법이 작동하지 않습니다. 'UIComponent' (http://download.oracle.com/javaee/6/api/javax/faces/component/UIComponent.html)로 구성 요소를 바인딩하여 동일한 위치에서 다른 곳에서 참조 할 수 있도록합니다. 내 대답의 예에서'forField' 에서처럼보기. 기본적으로'': "+ 컴포넌트를 전달합니다.getClientId()'를 호출합니다. 다시 : Mojarra, 당신이 처음에했던 것과 똑같은 방식으로 직관적으로 작동 할 것으로 예상됩니다 : forField = "nameTxt"와 for = "# {cc.attrs.forField}". – BalusC