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 =。
これを行う正しい方法は何ですか?
facet
をattribute
に交換することでこれを解決することができました。要約する:
<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フッター(空のフッターだけでなく)をレンダリングします。それ以外の場合は、指定されたテキストのフッター。」
Ui:paramを宣言し、レンダリング中にテンプレートにparamをチェックさせることができます。
テンプレート内のファセットは、次のように宣言できます。
<f:facet name="#{hideFooter == null or not hideFooter ? 'footer' : ''}">
#{message}
</f:facet>
その後、どのページでもこのパラメータを宣言できます
<ui:param name='hideFooter' value='#{some rule}' />
そして、パラメータに適切なルールを設定します。パラメータを宣言していないページの場合、フッターが表示されます。
複合コンポーネント内でファセットを条件付きでレンダリングしようとしたときに行ったことは次のとおりです。
<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を混合しますが、悪影響は見られませんでした。
プレーンJSFでも同様の問題が発生しました。どのように<p:panel>
がレンダリングされますが、テーブルとしてレンダリングされる場合は、次のことを試すことができます。
まず、次のようなCSSクラスを宣言します。
.HideFooter tfoot {
display: none;
}
次に、そのクラスをパネルで条件付きで設定します。
<p:panel styleClass="#{renderFooterCondition ? null : 'HideFooter'}">
フッターは引き続きJSFセンスでレンダリングされますが、ユーザーエージェントが表示したときに表示されず、ページ内のスペースを占有しません。
Ui:fragmentを使用してこの問題を正常に解決しました
<ui:fragment rendered="...Test...">
<f:facet name="footer">
...
</f:facet>
</ui:fragment>
たとえば、primefacesデータテーブルのフッターを条件付きでレンダリングするために機能します(ファセットのレンダリングされた属性は機能しません)。
ファセットはHTMLをレンダリングすることを目的としていないため、rendered属性がありません。ファセットはページに機能を追加します。ファセットという用語は、おそらく名前の選択としては不適切です。非常にあいまいです。
..ITworldのPhilJohnsonによってコンパイルされたリストが正しい場合、開発者が行う最も難しいことは 名前を付ける です。
すなわち。
プロジェクトファセットは、その機能が必要なときにプロジェクトに追加できる特定の機能単位です。プロジェクトファセットをプロジェクトに追加すると、特定のプロジェクトの特性に応じて、ネイチャー、ビルダー、クラスパスエントリ、およびリソースをプロジェクトに追加できます。 JSFファセットは、JSF対応のWebアプリケーションの特性を定義します。 JSFファセットは、JSFプロジェクトに適用される要件と制約を指定します。
JSFファセットは、Webアプリケーションに一連の動作と機能を提供します。
これがあなたのフッターにどれだけうまくいくかはわかりませんが、条件付きでレンダリングしようとした凡例にも同じ問題がありました。ファセットタグ内のレンダリングを使用して修正しました。
<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を試すのに苦労したので、これが私の解決策でした。あなたの問題とまったく同じではありませんが、似ています。
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ページを表示するには
これは、LudovicPénetからの回答に対する反対の回答です。
これは、p:dataTable(Primefaces 5.3)の選択された<f:facet name="footer">
アイテムのp:column
で機能しました。
.。
ui:fragment
をf:facet
の外側ではなく(ラップせずに)内側に配置していることに注意してください。すべてのフッターファセットがレンダリングされないようにテストされると、行全体が完全に削除されます(私が知る限り、ui:fragment
内のコンテンツとは関係ありません)。