web-dev-qa-db-ja.com

<ui:repeat>内の要素の条件付きレンダリングを指定しますか? <c:if>が機能していないようです

<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>

これは可能ですか?

23
Rajat Gupta

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="&lt;br/&gt;" escape="false" rendered="#{topicId eq -1}" />

クライアント側の属性が指定されていない場合、どちらもHTML出力に他に何も出力しないためです。

参照:


具体的な問題とは無関係、それは<br/>間違った場所です。 HTML仕様を尊重するWebブラウザは無視します。 <li>内部であるという意味ではありませんか?または、classを指定し、CSSにmargin-bottomを指定することをお勧めします。

36
BalusC