2015-01-30 8 views
0

저는 JSF/Facelets에 익숙하지 않고 ui : repeat 컴포넌트 내에서 컨텐츠를 렌더링할지 여부를 결정할 때 로직 배치에 가장 적합한 위치를 이해하려고합니다.JSF를 사용하여 상태로 로직 수행하기 ui : repeat 루프

내 백킹 빈에는 각각 날짜가 포함 된 메시지 목록이 있습니다. 모든 메시지를 인쇄하려고하지만 변경된 날짜 만 렌더링합니다.

현재 backing bean getter 메소드가 backing bean 내의 로직 및 설정 상태를 기반으로 메시지 날짜를 렌더링할지 여부를 결정하는 아래 항목이 있습니다. JSF는 여러 번 실제로 getter 메소드에 더 복잡성을 추가하는 렌더링하기 전에 getter 메소드를 호출하기 때문에

<ui:repeat value="#{bean.orderedMessages}" var="message" varStatus="messageLoop"> 

    <h:panelGroup rendered="#{bean.isDateRendered(messageLoop.index)}"> 
     #{message.formattedDate} 
    </h:panelGroup> 

    // some other stuff for each message 

</ui:repeat> 

이 버그와 끔찍한 코드는 무엇인가 렌더링 여부를해야하는지 여부 이외의 아무것도 할 수 없다 UI에 실제로 있어야하며 getter 메소드는 간단한 속성을 반환하는 것이 좋지만 반면에 getter 메서드에는 불쾌한 논리가 많이 있습니다.

나는 UI가 어떻게 든 마지막으로 렌더링 된 날짜의 상태를 저장하고 렌더링하는 것과 비교해야한다고 생각하지만 그게 맞는지는 확실하지 않습니다.

나는 이것이 드문 문제라고 생각하지 않습니다. 이 문제를 해결하는 좀 더 우아한 해결책이 있는지 아는 사람 있습니까?

+0

메시지를 다음과 같이

UI 계층

해주기 단순화된다. 항상 렌더링되지만 런타임에 List의 다른 메시지와 관련하여 순전히 렌더링 될 수도 있고 그렇지 않을 수도있는 속성 (날짜)을가집니다. 나는 이것이 메시지 객체에 존재해야한다고 생각하지 않는다. 왜냐하면 이것은 UI 객체이고 메시지는 다른 메시지에 대한 지식이 없기 때문이다. 이 질문은 반복 내의 개체 상태를 관리하는 문제와 해당 상태를 관리하는 방법과 관련됩니다. –

+0

아마도 JSF는 마지막으로 렌더링 된 날짜를 설정하는 backing 빈에서 <:c:set... >을 호출해야합니다. 이것이 좋은 연습인지 아닌지 확실하지 않거나 느껴지지 않습니다. –

답변

0

질문의 의견에 BalusC 님이 제기 한 생각에서 다음 해결책을 구현했습니다.

인스턴스가 @PostConstuct을 만들 때 엔티티/도메인 층에서 내 Message 객체가 나는 부울 속성뿐만 아니라 생성자에서 Message 소요 UIAugmentedMessage라는 UI 층의 다른 모델을 만들었습니다, 백킹 빈에 반환 isRendered의 경우는, 포맷 된 일자의 경우는 String

빈이 생성 된 직후 서버에서목록이 반환되고 isRendered 및 formattedDate 필드의 올바른 상태가 포함 된 경우 백킹 빈은 UIAugmentedMessage 개체 목록을 작성합니다. 데이터베이스에서 채워진 엔티티 이때

<ui:repeat value="#{bean.orderedMessages}" var="message"> 

    <h:panelGroup rendered="#{message.rendered}"> 
     #{message.formattedDate} 
    </h:panelGroup> 

</ui:repeat>