2

<c:if>中での使用は可能<a4j:repeat>ですか?

<br />4 つの要素ごとにレンダリングする必要があります。私は次のアプローチを試しました:

<a4j:repeat value="#{MBean.sucursal.events}" var="item" rowKeyVar="idx" >   
   <h:outputText value="#{item.eventDescription}" id="item1" />
   <c: if test=#{idx % 4 == 0}>
       <br />
   </c:if>
</a4j:repeat>

ただし、<br />要素はまったくレンダリングされません。

とにかく要件を達成するにはどうすればよいですか?

4

1 に答える 1

3

注: コードが適切にコンパイル/実行されない原因となるコードの不注意な定式化は無視します。スペースがあり、属性<c :if>に引用符がありません。<c:if test>今後の質問では、投稿するコード スニペットの適切性にもう少し注意を払ってください。そうしないと、赤いニシンのために無効な回答しか得られません。


具体的な問題に戻ると、この構成は実際に失敗します。は<c:if>ビューのビルド時 (JSF コンポーネント ツリーが Facelets/JSP ファイルに基づいて生成されようとしているとき) に<a4j:repeat>実行され、 はビューのレンダリング時 (JSF コンポーネント ツリーに基づいて HTML コードが生成されようとしているとき) に実行されます。そのため、現時点では、<c:if>runs#{idx}はスコープ内にまったく存在せず、常に と評価されnullます。

基本的に2つの解決策があります:

  1. アイテムを反復処理する<c:forEach>代わりに使用します。<a4j:repeat>ビューのビルド時に実行されるため、 と「同期して」実行されます<c:if>

    <c:forEach items="#{MBean.sucursal.events}" var="item" varStatus="loop">   
       <h:outputText value="#{item.eventDescription}" id="item#{loop.index}" />
       <c:if test="#{loop.index % 4 == 0}">
           <br />
       </c:if>
    </c:forEach>
    

    <h:outputText id>(私も同様に変更したことに注意してください。そうしないと、重複したコンポーネント ID エラーまたは不正な形式の HTML が発生します。id属性を完全に省略してもかまいません。JSF は適切な属性を自動生成します)

  2. HTML を条件付きでレンダリングする代わりに、 JSF コンポーネントのrendered属性を使用します。<c:if>ビューのレンダリング時間中に実行されるため、 と「同期して」実行されます<a4j:repeat>

    <a4j:repeat value="#{MBean.sucursal.events}" var="item" rowKeyVar="idx">   
       <h:outputText value="#{item.eventDescription}" id="item1" />
       <h:panelGroup rendered="#{idx % 4 == 0}">
           <br />
       </h:panelGroup>
    </a4j:repeat>
    

以下も参照してください。

于 2012-12-06T21:04:11.033 に答える