リストに格納されるアイテムを表す複合コンポーネントがあります。を使用してこれらのアイテムを表示したいのですが<ui:repeat>
、ajax 呼び出しに問題があります。問題は、<f:ajax>
レンダー属性の場合、コンポーネントのIDを渡したいということです
#{cc.clientId}
ただし、このドキュメントhttps://rogerkeays.com/jsf-c-foreach-vs-ui-repeat<ui:repeat>
で説明されている理由により、これを で使用するとエラーが発生します。
<cc:implementation>
<div id="#{cc.clientId}">
<h:form>
<h:commandLink styleClass="btn btn-info" value="Click me">
<f:ajax execute="@form"
render=":#{cc.clientId}"/>
</h:commandLink>
</h:form>
</div>
</cc:implementation>
上記のコンポーネントを使用して機能させる方法はありますか<ui:repeat>
(たとえば、<f:ajax>
タグ ハンドラーを置き換えることができるコンポーネントがあるか、または<c:forEach>
構築にこだわっています)?
<ui:repeat id="myComponent" value="#{backingBean.myComponentItem}" var="item" varStatus="itemIndex">
<components:exampleComponent id="myComponent"/>
</ui:repeat>
そこで、<c:forEach>
の代わりに を使用し始め<ui:repeat>
、 の render 属性でコンポーネントの ID を使用することができました<f:ajax>
。しかし、今回はページネーションを作成すると、リストのサイズが減少すると、ページに空のコンポーネントができ始めます。これを解決するために、ajax 呼び出しによるページネーションを開始し、空のコンポーネントの問題を解決しました。
すべてが解決したと思っていたところ、別の問題が発生しました。たとえば、10 個のコンポーネントをリストしたページがあり、別のページに移動し、そのページから再びコンポーネント表示ページに移動したとしますが、何らかの理由で今回はデータベースから 3 つのアイテムのみを取得しました。コンポーネントを介してこれらの 3 つのアイテムを表示したいだけで、他には何もありません。残念ながら、このシナリオでは 3 つのアイテムが正しく表示されますが、ページには 7 つの空のコンポーネントも含まれています。これを克服するには、もう一度このページにリダイレクトする必要があります。なので、この時点で諦めました。これとは別に、ページ上のコンポーネントの数が変更されると、最終的に以下の例外も発生します。
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.sun.faces.application.view.StateHolderSaver
投稿Jsf Error : java.lang.ClassCastExceptionで説明されている提案を使用しようとしましたが、うまくいきませんでした。上記の例外に似た別のエラーが発生し始めました。
<context-param>
<param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
<param-value>/pagename.xhtml</param-value>
</context-param>
したがって、これらの長い説明の後、ajax 対応で、独自の状態に完全に責任を持ち、他のコンポーネントから独立し、ページに表示できる複合コンポーネントを作成するための最良のアプローチは何かを学びたいと思います。コンポーネントの数は、ページのライフサイクル中に (ページネーション、ナビゲーションなどによって) 変わる場合があります。