2

リストに格納されるアイテムを表す複合コンポーネントがあります。を使用してこれらのアイテムを表示したいのですが<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 対応で、独自の状態に完全に責任を持ち、他のコンポーネントから独立し、ページに表示できる複合コンポーネントを作成するための最良のアプローチは何かを学びたいと思います。コンポーネントの数は、ページのライフサイクル中に (ページネーション、ナビゲーションなどによって) 変わる場合があります。

4

1 に答える 1

0

これまでのところ、私が思いついた最善の解決策は、ページ内のコンポーネントの数を確認し、その数が ajax 呼び出しによって、または別のページからのナビゲーションのために変更されたときに、宛先ページにもう一度リダイレクトすることです。これにより、空のページが更新されますユーザーに多くの妨害を与えることなく、ページ内のコンポーネント。より良い解決策を思いついた場合は、お知らせください。

于 2012-11-30T18:23:47.777 に答える