4

h:panelGroup パネルをレンダリングするページがあります。これらのパネルは、起動時にプラグイン レジストリに登録されたプラグインとして認識されます。プラグイン API の一部はカスタム jsf コンポーネントであり、拡張ポイント用に登録されたプラグインを取得し、それらの facelet テンプレートをパスでインクルードします。

<c:forEach items="#{pluginRegistry.getPlugins(point)}" var="extension">
    <ui:include src="#{extension.path}" />
</c:forEach>

パネルを含めたページは次のようになります。

<h:panelGrid id="dashboard" columns="3">
    <cmf:insertPageFragments point="dashboardExtensionPoint" />
</h:panelGrid>

すべてのパネルには、以下のような facelet テンプレートがあります。

<rich:panel id="caseDetailsPanel" header="panel label">
    <!-- panel content -->
</rich:panel>

問題は、pluginsRegistry によって返されるリストの最初のパネルが、たとえば formId:caseDetailsPanel のような提供された ID でページにレンダリングされることです。それらの残りは formId:j_idt223 のような ID を生成しました !!! 明らかに、一部のパネルを再レンダリングしたい場合、それはできません。

これは、環境が jboss AS 7.1 で JSF 2.1、richfaces 4.2.3.Final の場合に発生します。jboss-eap-6.1 にデプロイすると、すべて問題ないように見えますが、今のところ、この jboss バージョンを使用できません。

この問題を回避する方法について何か提案はありますか?

4

1 に答える 1

5

同じ ID を持つ複数の JSF コンポーネントは存在できません。各 JSF コンポーネントには一意の ID が必要です。JSTL を使用して JSF コンポーネントを動的に作成する場合、一意の ID を手動で割り当てて確保する必要があります。そうしないと、JSF は提供された ID を破棄し、一意の ID を自動生成します。

具体的な機能要件と既存のコードに応じて、これを実現する方法はいくつかあります。

  1. の反復インデックスを使用します<c:forEach>

    <c:forEach ... varStatus="loop">
        ...
        <rich:panel id="caseDetailsPanel_#{loop.index}" ...>
    

    これにより、現在の反復インデックスに応じて 、 などcaseDetailsPanel_0が生成されます。caseDetailsPanel_1

  2. 現在反復されているアイテムの一意の識別子を使用します。これまでに提供された情報に基づくと明確ではないため、背後のクラスに技術 DB 識別子を表すプロパティ#{extension}があると仮定した架空の例を次に示します。id

    <c:forEach ... var="extension">
        ...
        <rich:panel id="caseDetailsPanel_#{extension.id}" ...>
    
  3. インクルードを変​​更する必要がないように、必要に応じて #1 または #2<f:subview>を一意の識別子でラップします。

    <c:forEach ... varStatus="loop">
        <f:subview id="panel_#{loop.index}">
            <ui:include ... />
    

    はその周りに<f:subview>新しい を作成するため、最終的にはなどになります。NamingContainerformId:panel_0:caseDetailsPanelformId:panel_1:caseDetailsPanel

<ui:repeat>の代わりに使用するのは、まったく別の方法です<c:forEach>。は<ui:repeat>ビューのビルド時には実行されませんが、ビューのレンダリング時には実行されます。この方法で<rich:panel id="caseDetailsPanel">は、HTML の生成中に複数回再利用されるコンポーネント ツリーに物理的に 1 つのコンポーネントしかなく、JSF が<ui:repeat>so のようにインデックスを使用して適切な ID を生成しformId:repeatId:0:caseDetailsPanelます。<ui:include>ただし、これはビューのビルド時にも実行されるため、問題を引き起こす可能性があり#{extension}ます。

于 2013-05-23T12:52:47.647 に答える