使用带有JSF ui的状态执行逻辑:重复循环

时间:2015-01-30 11:33:07

标签: jsf-2 facelets uirepeat conditional-rendering

我是JSF / Facelets的新手,并且在决定是否在ui:repeat组件中呈现内容时,尝试了解最适合放置逻辑的位置。

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

目前我有类似下面的内容,其中backing 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方法中有一大堆令人讨厌的逻辑,而我更喜欢返回一个简单的属性。

我认为用户界面必须以某种方式存储上次渲染日期的状态,并将其与要渲染的日期进行比较,但我不确定这是否正确。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

UI层现在简化如下

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

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

</ui:repeat>