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 にある必要があるものをレンダリングする必要があるかどうか以外には何の関係もありません。ゲッターメソッドには厄介なロジックがたくさんありますが、単純なプロパティが返されることを好みます。

UI は、最後にレンダリングされた日付の状態を何らかの形で保存し、それをレンダリングしようとしている日付と比較する必要があると思いますが、それが正しいかどうかはわかりません。

これは珍しい問題ではないと思います。これを解決するためのよりエレガントなソリューションがあるかどうかは誰にもわかりませんか?

4

1 に答える 1

0

質問のコメントでBalusCが提起した考えから、次の解決策を実装しました。

Messageインスタンスが作成されると、エンティティ/ドメイン層からのオブジェクトがバッキング Bean に返されます。UI@PostConstuct層に別のモデルを作成しました。このモデルは、コンストラクターUIAugmentedMessageで を受け取り、MessageisRendered のブール値プロパティとフォーマット済みの文字列を受け取ります。日にち。

バッキング Bean は、Bean が構築された直後にサーバーからリストが返されたUIAugmentedMessageときにオブジェクトのリストを構築します。これには、isRendered およびformattedDate フィールドの正しい状態が含まれます。Message

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 に答える