2

私は次の構造を持っています(コンテンツと属性は省略されています):

<ui:repeat id="outerlist">
    <my:compositeComponent id="myCC">
        <h:panelgroup id="container">
            Some content here (outputText, etc.)
            <ui:repeat id="innerlist">
               <h:commandButton>
                   <f:ajax render=":#{cc.clientId}:container" />

<!-- all closing tags accordingly -->

コンテナ内のコンテンツは内部リストのボタンのアクションに依存するため、更新する必要があります。上記のアプローチは、外部がない場合に機能しui:repeatます。ただし、存在する場合はcomponent not foundエラーで失敗します。

これは、cc.clientIdthen自体に外部の行インデックスが含まれてui:repeatいるためと思われouterlist:0:myCC:containerます。この回答へのコメントが示すように、このインデックス付きIDは、ビューツリーのサーバー側の表現では使用できません。代わりに、「行インデックスはクライアント側にのみ存在します」。このインデックス作成がどのように行われ、サーバー側で何が利用できるのかを完全には理解していないことを認めなければなりません。

だから私の質問は:JSFはこのインデックスをどのように行うのか、(サーバー上で)どのように内部のさまざまな「インスタンス」を分離するui:repeatのか、そして上記のコードで達成しようとしていることの解決策はありますか?

4

3 に答える 3

3

で指定されたクライアント ID は、JSF によってサーバー側の両方<f:ajax>で使用可能でなければなりません。

facesContext.getViewRoot().findComponent(clientId);

(そのため、ajax 応答の新しい HTML 表現をレンダリングするために見つけることができます)

クライアント側では JavaScript による

document.getElementById(clientId);

(新しい HTML コンテンツを含む ajax 応答が到着したら、JS によって更新/置換できるようにするため)

<ui:repeat>ビューのレンダリング時にのみ実行されるため、行インデックスを持つクライアント ID はサーバー側で有効なコンポーネントを表していませんが (「コンポーネントが見つかりません...」という からのエラーfindComponent())、クライアント側で有効な HTML 要素を表しています。 . 基本的に、サーバー側には行インデックスのないクライアント ID が必要で、クライアント側には行インデックス付きのクライアント ID が必要です。しかし、<ui:repeat>(残念ながら) 特定の反復ラウンドのコンポーネント ツリーの状態を単独で選択することはできないため、それは機能しませんfindComponent()

JSTL<c:forEach>を使用し、ビューのビルド時に実行されるようにコンポーネント ID を動的に割り当てると、正常に動作し、レンダリング中に複数回再利用される 1 つだけではなく、ビュー ツリーに複数の完全な JSF コンポーネントが実際に生成されます。

<c:forEach varStatus="loop">
    <my:compositeComponent id="myCC">
        <h:panelGroup id="container_#{loop.index}">
            Some content here (outputText, etc.)
            <ui:repeat id="innerlist_#{loop.index}">
               <h:commandButton>
                   <f:ajax render=":#{cc.clientId}:container_#{loop.index}" />

ただし、複合コンポーネントで使用する場合や、ネストされたループで使用する場合には、これには独自の意味があります。あなたのコードは、それについての洞察とアドバイスを提供するのに十分ではありません。たとえば、このコードが複合コンポーネントに配置され、それ自体がレンダリング時間ループで複数回再利用されると、破損します。

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

于 2012-11-19T17:05:38.683 に答える