我如何有条件地渲染<f:facet>?</f:facet>

时间:2010-12-06 17:21:50

标签: jsf jsf-2 primefaces

我希望能够从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

这样做的正确方法是什么?

12 个答案:

答案 0 :(得分:14)

我能够通过将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>

by“works”我的意思是:

#{message}为空或null时,

“呈现页脚 - 而不仅仅是空页脚;否则,请使用指定文字正确呈现页脚。”


PrimeFaces forum thread on this issue

答案 1 :(得分:8)

你可以声明一个ui:param,让模板在渲染时检查参数。

然后可以将模板中的构面声明为:

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

然后任何页面都可以声明此参数

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

并为参数设置适当的规则。对于未声明参数的任何页面,将显示页脚。

答案 2 :(得分:6)

这是我尝试在复合组件中有条件地渲染构面时所做的。

<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>

如果需要,复合组件的用户可以提供标题构面,如果不需要,我们提供默认值。显然,您可以根本不做任何事情,而不是提供默认值。

这混合c:如果在jsf控件中,但我们没有看到任何不利影响。

答案 3 :(得分:2)

我遇到过普通JSF的类似问题。我不确定如何呈现<p:panel>,但如果它呈现为表格,您可以尝试这样做:

首先,声明一个这样的CSS类:

.HideFooter tfoot {
    display: none;
}

然后在面板上有条件地设置该类:

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

页脚仍然以JSF意义呈现,但在用户代理查看时,它不会显示,也不占用页面中的任何空间。

答案 4 :(得分:2)

我使用ui:fragment

成功解决了这个问题
<ui:fragment rendered="...Test...">
<f:facet name="footer">
...
</f:facet>
</ui:fragment>
例如,

可以条件渲染一个primefaces数据表的页脚(facet的渲染属性不起作用)。

答案 5 :(得分:0)

不确定这对你的页脚有多好,但我遇到了与我试图有条件渲染的传奇有同样的问题。我通过在facet标签内的任何内容上使用渲染来修复它。

<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>

我很难尝试c:如果用我的ui:重复,那么这就是我的解决方案。与您的问题不太一样,但类似。

答案 6 :(得分:0)

Facets不打算呈现HTML,这就是它没有呈现属性的原因。 Facets为页面添加功能。术语facet可能是一个糟糕的名称选择。这很模糊。

  

..如果由ITworld的Phil Johnson编制的列表是正确的,那么   开发人员最难做的事情是name things

JSF facets

项目构面是一个特定的功能单元,您可以在需要该功能时将其添加到项目中。将项目构面添加到项目时,它可以向项目添加属性,构建器,类路径条目和资源,具体取决于特定项目的特征。 JSF方面定义了支持JSF的Web应用程序的特性。 JSF方面指定了适用于JSF项目的要求和约束。

JSF facets为您的Web应用程序提供了一组行为和功能。

答案 7 :(得分:0)

这是对LudovicPénet答案的反驳。

这对于<f:facet name="footer">我在p:dataTable(Primefaces 5.3)的选定p:column项中的工作原理:

         ...         

请注意我ui:fragment内的f:facet,而不是外(不包裹)它。当每个页脚小平面被测试为不渲染时,它肯定会完全删除整行(据我所知,与ui:fragment中的内容无关)。

答案 8 :(得分:0)

试试这个,来自primefaces网页

<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'网页

答案 9 :(得分:0)

对于那些试图隐藏页脚而不是页眉但语法component.facets.footer不起作用的人,应该试试这个:< /p>

<p:panel id="panelContent">
    <c:if test="#{not empty cc.facets.footer}">
        <f:facet name="footer" height="100%">
           your content
        </f:facet>
    </c:if>
</panel>

答案 10 :(得分:-1)

为什么不将页脚的内容包含在具有呈现属性的panelGroup中?

这样:

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

我在我的weapp中执行它并且它有效,没有渲染页脚。

我不使用primefaces,我用h:datatable做,但我认为它必须适用于p:panel。

答案 11 :(得分:-1)

我试试这个解决方案,好吧。 (http://www.coderanch.com/t/431222/JSF/java/dynamically-set-panel-header-condition

<rich:dataGrid value="#{myMB.student.list}" rendered="#{!empty myMB.student and !empty myMB.student.list}" var="st" rowKeyVar="row">
    <rich:panel>                                            
        <f:facet name="header">
        <h:panelGroup id="panelHeader">
            <h:outputText value="Just one student" id="header1" required="true" rendered="#{!myMB.manyStudents}"/>
            <h:outputText value="#{row+1}º Student"  id="header2" required="true"  rendered="#{myMB.manyStudents}"/>
            </h:panelGroup>                                 
        </f:facet>
<rich:panel>