0

我对 JSF / Facelets 很陌生,并试图了解在决定是否在 ui:repeat 组件中呈现内容时最适合放置逻辑的位置。

在我的支持 bean 中,我有一个消息列表,每个消息都包含一个日期。我想打印所有消息,但只在它更改时呈现日期。

目前,我有类似下面的内容,其中支持 bean getter 方法根据支持 bean 中的逻辑和设置状态确定是否呈现消息日期。

<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>

这是错误和可怕的,因为 JSF 在实际渲染之前多次调用 getter 方法,这给 getter 方法增加了进一步的复杂性,除了是否应该渲染某些东西应该在 UI 中之外,代码与其他任何事情无关并且 getter 方法中有一大堆讨厌的逻辑,而我更喜欢返回一个简单的属性。

我相信 UI 必须以某种方式存储最后呈现日期的状态,并将其与即将呈现的日期进行比较,但我不确定这是否正确。

我不相信这是一个不常见的问题。有谁知道是否有更优雅的解决方案来解决这个问题?

4

1 回答 1

0

根据BalusC在问题评论中提出的想法,我实施了以下解决方案。

创建实例时,我Message的实体/域层的对象将返回到支持 bean @PostConstuct,我在 UI 层中创建了另一个模型,该模型调用UIAugmentedMessageMessage构造函数中的 以及 isRendered 的布尔属性和格式化的字符串日期。

支持 bean 在构建 bean后从服务器返回列表UIAugmentedMessage时构建对象Message列表,其中包含 isRendered 和 formattedDate 字段的正确状态。

UI层现在简化如下

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

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

</ui:repeat>
于 2015-01-30T14:15:30.837 回答