4

私は現在、JSFと少し戦っています。商品一覧を表示したい。各アイテムは 2 つの facelet で表示できます (アイテムが編集可能な場合は 1 つ、それ以外の場合は 1 つ)。

コードスニペット:

<div>
   <c:forEach items="#{bean.itemList}" var="item">
      <c:choose>
         <c:when test="#{bean.isEditable(item.id)}">
            <ui:include src="#{item.editableFaceletPath}>
               <ui:param name="item" value="#{item}" />
            </ui:include>
         </c:when>
         <c:otherwise>
            <ui:include src="#{item.normalFaceletPath}>
               <ui:param name="item" value="#{item}" />
            </ui:include>      
         </c:otherwise>
      </c:choose>
   </c:forEach>
</div>

アイテムを編集可能に設定しない限り、これは正常に機能します。ただし、item1、item2、item3 の 3 つのアイテムがあり、item1 を編集可能に設定すると、item2、item2、item3 が表示されます。

なぜ機能しないのかは理解していますが、それ以外の方法で実装する方法がまったくわかりません。誰にも方法はありますか?

4

2 に答える 2

2

JSF のさまざまなライフサイクル フェーズでの評価に関するよくある間違いについては、このリンクを参照してください。

問題は、ビューの作成時に JSTL タグが 1 回しか評価されないことです。アイテムを編集可能に変更すると、以前に構築されたコンポーネント ツリーには影響しなくなります。

解決策は、<c:choose><c:when><c:otherwise>を 2 つに置き換えて と<ui:fragment>rendered="#{bean.isEditable(item.id)}"置き換えることrendered="#{not bean.isEditable(item.id)}"です。

そうすれば、コンポーネント ツリーの両方のブランチがビューに表示されますが、レンダリング時には、rendered属性のためにそのうちの 1 つだけが評価されて表示されます。

ただし、この構成全体は、アイテムのリストを変更しない限り機能します。アイテムを追加または削除しても、それ以降は影響を受け<c:forEach>ないためです。その場合、 を完全に使用せずに と を組み合わせて使用​​する必要が<ui:include>あり<ui:repeat>ます<ui:fragment rendered="#{...}">

于 2013-10-09T18:27:59.693 に答える