web-dev-qa-db-ja.com

<f:facet>を条件付きでレンダリングするにはどうすればよいですか?

PrimeFacesパネル要素から条件付きでフッターを省略できるようにしたいと思います。

<p:panel header="some text">
    <f:facet name="footer">
        #{message}
    </f:facet>
    <!-- ... -->
</p:panel>

rendered属性が機能することを期待しました。

<p:panel header="some text">
    <f:facet name="footer" rendered="#{!empty message}">
        #{message}
    </f:facet>
    <!-- ... -->
</p:panel>

ただし、フッターは空のコンテンツでレンダリングされたままです。 facetにはrendered属性がないようです: http://www.jsftoolbox.com/documentation/help/12-TagReference/core/f_facet.html =。

これを行う正しい方法は何ですか?

19
Matt Ball

facetattributeに交換することでこれを解決することができました。要約する:

これは動作します

<p:panel ...>
    <f:attribute name="footer" value="#{message}"/>
    <!-- ... -->
</p:panel>

しかし、これは機能しません

<p:panel footer="#{message}">
    <!-- ... -->
</p:panel>

これもしません

<p:panel ...>
    <f:facet name="footer">#{message}</f:facet>
    <!-- ... -->
</p:panel>

これも

<p:panel ...>
    <f:facet name="footer">
        <h:outputText value="#{message}" rendered="#{!empty message}"/>
    </f:facet>
    <!-- ... -->
</p:panel>

「作品」とは、次のことを意味します。

"#{message}が空またはnullの場合、noフッター(空のフッターだけでなく)をレンダリングします。それ以外の場合は、指定されたテキストのフッター。」


この問題に関するPrimeFacesフォーラムスレッド

14
Matt Ball

Ui:paramを宣言し、レンダリング中にテンプレートにparamをチェックさせることができます。

テンプレート内のファセットは、次のように宣言できます。

<f:facet name="#{hideFooter == null or not hideFooter ? 'footer' : ''}">
     #{message}
</f:facet>

その後、どのページでもこのパラメータを宣言できます

<ui:param name='hideFooter' value='#{some rule}' />

そして、パラメータに適切なルールを設定します。パラメータを宣言していないページの場合、フッターが表示されます。

8
Adit

複合コンポーネント内でファセットを条件付きでレンダリングしようとしたときに行ったことは次のとおりです。

<composite:interface>
    <composite:facet name="header" required="false" />
</composite:interface>
<composite:implementation>
    <p:panel>
        <c:if test="#{empty component.facets.header}" >
            <f:facet id="#{cc.attrs.id}_default_header" name="header">
            all sorts of stuff here
            </f:facet>
        </c:if>
        <c:if test="#{not empty component.facets.header}">
            <composite:insertFacet id="#{cc.attrs.id}_custom_header" name="header" />
        </c:if>
        <composite:insertChildren id="#{cc.attrs.id}_content"/>
    </p:panel>
</composite:implementation>

これにより、複合コンポーネントのユーザーが必要に応じてヘッダーファセットを提供し、必要がない場合はデフォルトを提供します。明らかに、デフォルトを提供する代わりに、あなたは単に何もすることができませんでした。

これはjsfコントロールでc:ifを混合しますが、悪影響は見られませんでした。

6
digitaljoel

プレーンJSFでも同様の問題が発生しました。どのように<p:panel>がレンダリングされますが、テーブルとしてレンダリングされる場合は、次のことを試すことができます。

まず、次のようなCSSクラスを宣言します。

.HideFooter tfoot {
    display: none;
}

次に、そのクラスをパネルで条件付きで設定します。

<p:panel styleClass="#{renderFooterCondition ? null : 'HideFooter'}">

フッターは引き続きJSFセンスでレンダリングされますが、ユーザーエージェントが表示したときに表示されず、ページ内のスペースを占有しません。

2
Björn Pollex

Ui:fragmentを使用してこの問題を正常に解決しました

<ui:fragment rendered="...Test...">
<f:facet name="footer">
...
</f:facet>
</ui:fragment>

たとえば、primefacesデータテーブルのフッターを条件付きでレンダリングするために機能します(ファセットのレンダリングされた属性は機能しません)。

2
Ludovic Pénet

ファセットはHTMLをレンダリングすることを目的としていないため、rendered属性がありません。ファセットはページに機能を追加します。ファセットという用語は、おそらく名前の選択としては不適切です。非常にあいまいです。

..ITworldのPhilJohnsonによってコンパイルされたリストが正しい場合、開発者が行う最も難しいことは 名前を付ける です。

すなわち。

JSFファセット

プロジェクトファセットは、その機能が必要なときにプロジェクトに追加できる特定の機能単位です。プロジェクトファセットをプロジェクトに追加すると、特定のプロジェクトの特性に応じて、ネイチャー、ビルダー、クラスパスエントリ、およびリソースをプロジェクトに追加できます。 JSFファセットは、JSF対応のWebアプリケーションの特性を定義します。 JSFファセットは、JSFプロジェクトに適用される要件と制約を指定します。

JSFファセットは、Webアプリケーションに一連の動作と機能を提供します。

0
user1491819

これがあなたのフッターにどれだけうまくいくかはわかりませんが、条件付きでレンダリングしようとした凡例にも同じ問題がありました。ファセットタグ内のレンダリングを使用して修正しました。

<p:fieldset>
<f:facet name="legend">
    <h:outputText value="#{header1}" rendered="#{header1.exists}"/>
    <h:outputText value="#{header2}" rendered="#{not header1.exists}"/>
</f:facet>
content
</p:fieldset>

Ui:repeatでc:ifを試すのに苦労したので、これが私の解決策でした。あなたの問題とまったく同じではありませんが、似ています。

0
eisbaer

PrimefacesのWebページからこれを試してください

<p:columnGroup type="footer">
    <p:row>
        <p:column colspan="3" style="text-align:right" footerText="Totals:" />
        <p:column footerText="your value in ajax" />

        <p:column footerText="your value in ajax" />
    </p:row>
</p:columnGroup>

clik here 、primefacesのWebページを表示するには

0

これは、LudovicPénetからの回答に対する反対の回答です。

これは、p:dataTable(Primefaces 5.3)の選択された<f:facet name="footer">アイテムのp:columnで機能しました。

.。

ui:fragmentf:facetの外側ではなく(ラップせずに)内側に配置していることに注意してください。すべてのフッターファセットがレンダリングされないようにテストされると、行全体が完全に削除されます(私が知る限り、ui:fragment内のコンテンツとは関係ありません)。