私は 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 にある必要があるものをレンダリングする必要があるかどうか以外には何の関係もありません。ゲッターメソッドには厄介なロジックがたくさんありますが、単純なプロパティが返されることを好みます。
UI は、最後にレンダリングされた日付の状態を何らかの形で保存し、それをレンダリングしようとしている日付と比較する必要があると思いますが、それが正しいかどうかはわかりません。
これは珍しい問題ではないと思います。これを解決するためのよりエレガントなソリューションがあるかどうかは誰にもわかりませんか?