3

私は JSF と Primefaces に少し慣れていないので、Primefaces GridPanel を含む複合コンポーネントを作成したいと考えています。

<composite:interface>
    <composite:attribute name="bind" type="com.whatever.IBackingBean"/>
    <composite:facet name="headerCols"/>
    <composite:facet name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
    <p:panelGrid>
        <p:row>
            <composite:renderFacet name="headerCols"/>
            <p:column>
                <h:outputText value="Col1" />
            </p:column>
            <p:column>
                <h:outputText value="Col2" />
            </p:column>
            <p:column>
                <h:outputText value="Col3" />
            </p:column>
        </p:row>

        <p:row>
            <composite:renderFacet name="bodyCols"/>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop1}" />
            </p:column>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop2}" />
            </p:column>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop3}" />
            </p:column>
        </p:row>
    </p:panelGrid>
</h:form>
</composite:implementation>

そして、次のような使い方をしたいと思います:

<x:mycomposite bind="#{myBackingBean}">
    <f:facet name="headerCols">
        <p:column>
             <h:outputText value="My Extra Prop"/>
        </p:column>
    </f:facet>
    <f:facet name="bodyCols">
        <p:column>
             <h:outputText value="#{myBackingBean.extraProp}"/>
        </p:column>
    </f:facet>
</x:mycomposite>

しかし、これを行うと...ファセットが追加されません。これはおそらく、(おそらく) コンポジットでも<composite:renderFacet>あるパラメーターとして使用できないことに関係していると思います。<p:panelGrid>

行ではなく列を追加する必要があるため、複数の場所に追加する必要があるため、<composite:insertChildren>機能しません。

おそらく属性を使用することもできますが、要素の値を属性値として渡すにはどうすればよいでしょうか? このようなものは利用できないようです:

<x:mycomposite bind="#{myBackingBean}">
    <f:attribute name="headerCols">
        <p:column>
             <h:outputText value="My Extra Prop"/>
        </p:column>
    </f:attribute>
    <f:attribute name="bodyCols">
        <p:column>
             <h:outputText value="#{myBackingBean.extraProp}"/>
        </p:column>
    </f:attribute>
</x:mycomposite>

これは、コンポジットを次のように変更したと仮定します。

<composite:interface>
    <composite:attribute name="bind" type="com.whatever.IBackingBean"/>
    <composite:attribute name="headerCols"/>
    <composite:attribute name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
    <p:panelGrid>
        <p:row>
            #{cc.attrs.headerCols}
            <p:column>
                <h:outputText value="Col1" />
            </p:column>
            <p:column>
                <h:outputText value="Col2" />
            </p:column>
            <p:column>
                <h:outputText value="Col3" />
            </p:column>
        </p:row>

        <p:row>
            #{cc.attrs.bodyCols}
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop1}" />
            </p:column>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop2}" />
            </p:column>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop3}" />
            </p:column>
        </p:row>
    </p:panelGrid>
</h:form>
</composite:implementation>

使用パターンを機能させる方法について、誰かが代替案やアドバイスを提供できますか?

ありがとう!

4

1 に答える 1

0

技術的には解決策ではない回避策を投稿します。そのため、そのようにマークするのは公平ではないと思います。

これが実際には解決策ではない理由は、実際には Primefaces を使用せず<p:panelGrid>(そのレイアウト オプションは全体としてゆっくりと嫌悪し始めていますが、それは別のトピックです)、代わりに HTML5 を使用するため<table>です。それは私が望んでいた全体的な目標を達成しますが、ルック アンド フィールの一貫性を保つために、すべての正しい Primefaces スタイルをテーブル ウィジェットに手動で追加する必要があります。

誰かが別の解決策を持っているなら、私はそれを見てみたい.

<composite:interface>
    <composite:attribute name="bind" type="com.whatever.IBackingBean"/>
    <composite:facet name="headerCols"/>
    <composite:facet name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
<table>
    <tr>
        <composite:renderFacet name="headerCols"/>
        <th>
            <h:outputText value="Col1" />
        </th>
        <th>
            <h:outputText value="Col2" />
        </th>
        <th>
            <h:outputText value="Col3" />
        </th>
    </tr>

    <tr>
        <composite:renderFacet name="bodyCols"/>
        <td>
            <h:outputText value="#{cc.attrs.bind.prop1}" />
        </td>
        <td>
            <h:outputText value="#{cc.attrs.bind.prop2}" />
        </td>
        <td>
            <h:outputText value="#{cc.attrs.bind.prop3}" />
        </td>
    </tr>
</table>
</h:form>
</composite:implementation>
于 2014-10-03T21:44:49.470 に答える