2011-04-08 4 views
2

조건부로 여러 요소를 표시하는 최상의 전략은 무엇입니까 (예 : bean 값에 따라 달라지는 필드 목록)? 내가 생각여러 필드에 대한 조건부 표시 - JSF 2.0/Primefaces

가능한 해결책 :

  1. JSTL <c:if ... > 절. 내가 JSF와 JSTL을 사용하여 이해가 입니다
  2. 대부분의 구성 요소의 "렌더링 된" 속성을 사용합니다. 나는이 분야의 많은 을 처리해야 할 때 불행하게도 그것은
  3. 컨테이너에 렌더링 속성 을 컨테이너 에 요소를 퍼팅 및 설정 ... 각 하나를 설정 서투른된다

옵션 3이 가장 현명한 것 같지만 필드를 감싸는 데 사용할 구성 요소를 모르겠습니다. 레이아웃에 영향을 미치지 않는 구성 요소 여야합니다.

스팬을 래퍼로 사용하고 CSS 표시 속성을 설정할 수 있지만 필드는 계속 보이지 않고 그대로 표시됩니다.

의견이 있으십니까?

업데이트 :

는 여기에 몇 가지 실제 레이아웃 코드입니다. 나는 모두 시도했습니다 <h:panelGroup> & <ui:fragment>. 이러한 태그 중 하나를 사용하면 내 모든 필드를 하나의 <td>에 넣을 수 있습니다. 이는 내 최상위 요소를 내 panelGrid에 넣기 때문에 의미가 있습니다.

내가 원하는 방식으로 작동하는 유일한 것은 위의 목록에서 # 2입니다.

<h:panelGrid columns="2"> 
     <!-- fields if person --> 
     <ui:fragment rendered="#{createEntity.entityType eq 'fizica'}"> 
      <h:outputLabel value="Prenume: " /> 
       <h:inputText value="#{createEntity.person.firstName}" /> 
      <h:outputLabel value="Nume familie: " /> 
       <h:inputText value="#{createEntity.person.familyName}" /> 
      <h:outputLabel value="CNP: " /> 
       <h:inputText value="#{createEntity.person.cnp}" /> 
      <h:outputLabel value="Date carte identitate: " /> 
       <h:inputText value="#{createEntity.person.idCardInfo}" /> 
      <h:outputLabel value="Cetatenie: " /> 
       <h:inputText value="#{createEntity.person.country}" /> 
     </ui:fragment> 

     <!-- fields for company --> 
     <ui:fragment rendered="#{createEntity.entityType eq 'juridica'}">   
      <h:outputLabel value="Denumire firma" /> 
       <h:inputText value="#{createEntity.company.name}" /> 
      <h:outputLabel value="CUI" /> 
       <h:inputText value="#{createEntity.company.cui}" /> 
      <h:outputLabel value="Registrul Comertului" /> 
       <h:inputText value="#{createEntity.company.regCommerceNo}" /> 
     </ui:fragment> 
    </h:panelGrid> 
+0

'rendered' 속성을 사용하는 것은'c : if'보다 더 쓸쓸합니다. – BalusC

+2

@BalusC : 예를 들어 조건부로 표시하려는 5 개의 필드 + 5 개의 레이블이있는 경우 이는 "렌더링"조건을 10 번 복사하여 붙여 넣어야한다는 것을 의미합니다. 그게 내게 서툴 잖아 ... – Bogdan

+0

'c : if test'를'ui : fragment rendered'로 바꾸지 않는 이유는 무엇입니까? 이미 JSTL의'c : if' 태그로 포장했습니다. 대신 적절한 JSF 태그로 포장해야합니다. – BalusC

답변

5

렌더링 된 것은 구성 요소를 표시하는 (또는 표시하지 않는) 권장 방법입니다.

함께 그룹화 할 수 있으면 컨테이너의 렌더링 된 속성을 설정하는 것이 완벽하게 유효합니다. 각 개별 구성 요소에 렌더링 된 특성을 설정하는 것이 더 바람직합니다.

유일한 단점은 디스플레이가 동적이며 (백킹 빈 값을 변경하는 경우) 콘테이너를 다시 표시해야하는 경우입니다. 존재하지 않습니다. 컨테이너를 다른 컨테이너에 랩핑 한 다음 다시 렌더링해야합니다.

2

h:panelGroup을 컨테이너로 사용할 수 있습니다. 렌더링 된 속성을 가지며 스팬이됩니다 (기본적으로).

+0

HTML로 끝나야하는 속성을 설정하지 않으면 아무 것도 출력하지 않습니다. – BalusC

+0

수정하십시오. 나는 HTML 태그가 생성되면 기본적으로 스팬 (layout 속성을 통해 변경할 수 있음)을 의미합니다. id/style/styleClass 속성이 지정되지 않고 구성 요소에 대해 클라이언트 비헤이비어가 정의되지 않은 경우 실제로는 아무 것도 생성되지 않습니다. – wjans

+0

내 업데이트 된 게시물을 참조하십시오. 감사. – Bogdan

0

다른 구성 요소 (예 : ui : fragment 또는 h : panelGroup)에 내 열 값을 래핑했을 때 해당 구성 요소에 렌더링 된 내용을 사용했기 때문에 panelGrid는 전체 UI 조각을 실제로 하나의 열로 처리했기 때문에 사용해야했습니다. 내 테이블을 망 쳤어. 놀랍게도, <c:otherwise>은 나를 위해 작동하지 않는 것 같았습니다.

0

추한,하지만 어쩌면 조건 스타일을 통해, 당신을 위해 작업 :

<h:component value="foo" style="#{!myBean.displayFoo ? 'display: none;' : ''}" /> 
-2

당신이 당신의 데이터베이스의 사용자 변수의 값을 가지는 조건으로 요청하는 경우 : 나는 이유를 실패

<c:if test="#{myObject.mycolumnTableDB==value1}"> 
    <!-- columns to display for this condition --> 
</c:if> 
<c:if test="#{myObject.mycolumnTableDB==value2}"> 
    <!-- other stuff to display --> 
</c:if> 
+1

이것은 2 년 전에 나온 Lance의 답변과 크게 다르지 않습니다. –

관련 문제