<ui:repeat>
を使用して条件付きでカスタムリストを作成しようとしています。リスト内のitem-valueとして-1が出現するたびに、改行を追加する必要があります。
そのために<c:if>
内で<ui:repeat>
を使用しようとしましたが、機能していないようです。常にfalse
を評価します。
<ul>
<ui:repeat value="#{topics.list}" var="topicId" >
<li>#{topicId}</li>
<c:if test="#{topicId eq -1}"> <br/> </c:if>
</ui:repeat>
</ul>
これは可能ですか?
JSTLタグではありません。これらは、ビューのレンダリング時間ではなく、ビューのビルド時間中に実行されます。次のように視覚化できます。JSFがビューを作成すると、JSTLタグが最初に下から実行され、結果は純粋なJSFコンポーネントツリーになります。次に、JSFがビューをレンダリングすると、JSFコンポーネントが上から下に実行され、結果がHTMLの束になります。そのため、JSTLとJSFは、コーディングから期待されるように同期して実行されません。 <c:if>
が実行されている時点では、#{topicId}
はスコープで使用できません。
<c:if>
を使用する代わりに、対象のJSFコンポーネントのrendered
属性で条件を指定する必要があります。実際には何もないので、 <ui:fragment>
でラップすることができます。
<ul>
<ui:repeat value="#{topics.list}" var="topicId" >
<li>#{topicId}</li>
<ui:fragment rendered="#{topicId eq -1}"><br/></ui:fragment>
</ui:repeat>
</ul>
代替案は <h:panelGroup>
<h:panelGroup rendered="#{topicId eq -1}"><br/></h:panelGroup>
または特定の場合 <h:outputText escape="false">
<h:outputText value="<br/>" escape="false" rendered="#{topicId eq -1}" />
クライアント側の属性が指定されていない場合、どちらもHTML出力に他に何も出力しないためです。
具体的な問題とは無関係、それは<br/>
の間違った場所です。 HTML仕様を尊重するWebブラウザは無視します。 <li>
の内部であるという意味ではありませんか?または、class
を指定し、CSSにmargin-bottom
を指定することをお勧めします。