6

h:datatable または p:datatable が私のニーズに合わないため、実際にカスタム複合テーブル コンポーネントを作成しようとしています。それでも、primefaces データテーブルのように使用されます。JSF 複合コンポーネントの子リストの Expose 項目を見つけた後、複合コンポーネント内で繰り返し処理を行っていましたが、今は行き詰まりました。

私のxhtml

<h:body>
    <sm:datatable mode="columntoggle" id="mytable" value="#{managerBean.objects}" var="object">
        <sm:column header="KeyHeader" property="key">
            <h:outputText value="#{object.key}"/>    
        </sm:column>
        <sm:column header="ValueHeader" property="value">
            <h:outputText value="#{object.value}"/>    
        </sm:column>
    </sm:datatable>
</h:body>

そして、これはデータテーブルコンポジットです:

<cc:interface>
    <cc:attribute name="id" />
    <cc:attribute name="mode" />
    <cc:attribute name="var" />
    <cc:attribute name="value" type="java.util.List"/>
</cc:interface>

<cc:implementation>
    <table data-role="table" data-mode="#{cc.attrs.mode}" id="my-table">
        <thead>
            <tr>
                <ui:repeat value="#{component.getCompositeComponentParent(component).children}" var="child">
                    <th>
                        <h:outputText value="#{child.attrs.header}"/>
                    </th>
                </ui:repeat>
            </tr>
        </thead>
        <tbody>
            <ui:repeat value="#{cc.attrs.value}" var="object">
                <tr>
                    <c:forEach items="#{cc.children}" var="child" varStatus="loop">
                        <cc:insertChildren/>
                    </c:forEach>
                </tr>
            </ui:repeat>
        </tbody>
    </table>
</cc:implementation>

これが列コンポジットです

<cc:interface>
    <cc:attribute name="header" />
    <cc:attribute name="property" />
    <cc:facet name="content"/>
</cc:interface>

<cc:implementation>
    <td><cc:insertChildren/></td>
</cc:implementation>

スレッドはスタンドアロンで動作します

tbodyはスタンドアロンで動作します

上記のようにそれらをまとめると、tbody しか得られません。スレッドは常に空のままです 何か提案はありますか? 事前にご協力いただきありがとうございます!

4

4 に答える 4

5

これはバグではなく、mojarra で設計されたとおりに動作します。cc:insertChildren を使用すると、子が cc:insertChildren タグの親タグに移動します。この問題は別の問題と同等であり、解決策も同じです。この質問に対する私の回答を参照してください。

基本的に、 を の<ui:fragment>周りに置き、<cc:insertChildren>そのフラグメントを FacesComponent Bean のプロパティにバインドします。

于 2015-07-24T20:51:25.160 に答える
1

子を反復処理して同じコンポーネントで使用<composite:insertChildren />することはほぼ不可能であることがわかりました。少なくとも Mojarra 2.2.6 実装では。

中間ファセットアプローチも私にはうまくいきませんでした。

最終的に、私の解決策は次のとおりでした。

  1. 子コンポーネント (タブ) をそのまま保持する
  2. 親(タブグループ)コンポーネントのcomposite:implementationからすべてのコードを削除
  3. encodeAll()親に対応する顔コンポーネントに実装する

この質問は 1 年以上前のものです。より簡単な解決策が見えている場合は共有してください。

于 2014-12-10T12:12:45.223 に答える
1

#{cc.children}これは #{component.getCompositeComponentParent(component).children}両方とも機能するはずですが、何らかの理由で一部のバージョンで機能しないことと同等です.JSFのこの部分はまだバグが少ないと思います.

やってみました

 #{cc.getFacets().get('javax.faces.component.COMPOSITE_FACET_NAME').children}

こちらのスレも参考にしてください

JSF2では、複合コンポーネントに子があるかどうかを知る方法は?

于 2013-03-07T03:44:56.553 に答える