Jsf 2 使用JSF ui:repeat循环执行状态逻辑
我对JSF/Facelets非常陌生,在决定是否在ui:repeat组件中呈现内容时,我试图理解逻辑的最佳位置 在我的backingbean中,我有一个消息列表,每个消息都包含一个日期。我想打印所有消息,但仅在日期更改时呈现日期 目前,我有一些类似于下面的内容,其中backingbean getter方法根据逻辑和backingbean中的设置状态确定是否呈现消息日期Jsf 2 使用JSF ui:repeat循环执行状态逻辑,jsf-2,facelets,uirepeat,conditional-rendering,Jsf 2,Facelets,Uirepeat,Conditional Rendering,我对JSF/Facelets非常陌生,在决定是否在ui:repeat组件中呈现内容时,我试图理解逻辑的最佳位置 在我的backingbean中,我有一个消息列表,每个消息都包含一个日期。我想打印所有消息,但仅在日期更改时呈现日期 目前,我有一些类似于下面的内容,其中backingbean getter方法根据逻辑和backingbean中的设置状态确定是否呈现消息日期 <ui:repeat value="#{bean.orderedMessages}" var="message" varS
<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必须以某种方式存储最后渲染日期的状态,并将其与即将渲染的状态进行比较,但我不确定这是否正确
我不认为这是一个罕见的问题。有人知道有没有更优雅的解决方案吗?根据问题评论中提出的想法,我实施了以下解决方案 当在@PostConstuct创建实例时,实体/域层中的消息对象将返回给支持bean。我在UI层中创建了另一个名为UIAugmentedMessage的模型,该模型在构造函数中获取消息以及isRendered的布尔属性和格式化日期的字符串 当消息列表在构建bean之后从服务器返回时,支持bean构建UIAugmentedMessage对象的列表,该列表包含isRendered和formattedDate字段的正确状态 UI层现在简化如下
<ui:repeat value="#{bean.orderedMessages}" var="message">
<h:panelGroup rendered="#{message.rendered}">
#{message.formattedDate}
</h:panelGroup>
</ui:repeat>
此实例中的消息是从数据库填充的实体。它将始终被呈现,但其属性日期可能会或可能不会在运行时纯粹相对于列表中的其他消息呈现。我认为逻辑不应该存在于消息实体中,因为这是一个UI,消息也不知道其他消息。这个问题与管理repeat中对象的状态以及如何管理该状态有关。不确定这是否是一个好的做法,因为它感觉不太像。