21

我希望能够有条件地从 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

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

4

12 回答 12

14

我能够通过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;否则,正确地呈现带有指定文本的页脚。”


有关此问题的 PrimeFaces 论坛主题

于 2010-12-06T21:04:00.387 回答
9

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

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

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

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

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

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

于 2012-05-06T00:29:25.880 回答
7

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

<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,但我们没有看到任何不利影响。

于 2010-12-06T19:57:14.253 回答
2

我在普通的 JSF 中遇到了类似的问题。我不确定 a<p:panel>是如何呈现的,但如果它呈现为表格,你可以试试这个:

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

.HideFooter tfoot {
    display: none;
}

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

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

页脚仍然以 JSF 的方式呈现,但在用户代理查看时它不显示并且不占用页面中的任何空间。

于 2011-09-05T16:54:33.900 回答
2

我使用 ui:fragment 成功解决了这个问题

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

例如,用于条件渲染 primefaces 数据表的页脚(刻面的渲染属性不起作用)。

于 2013-01-31T10:01:40.083 回答
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>

我很难用我的 ui:repeat 尝试 c:if,所以这是我的解决方案。与您的问题不完全相同,但相似。

于 2013-09-04T15:44:29.777 回答
0

构面不打算呈现 HTML,这就是它没有渲染属性的原因。构面向页面添加功能。术语方面可能是一个糟糕的名称选择。这是非常模棱两可的。

..如果 ITworld 的 Phil Johnson 编制的列表是正确的,那么开发人员做的最难的事情就是命名事物

IE。

JSF 方面

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

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

于 2014-03-02T22:17:55.263 回答
0

这是对 Ludovic Pénet 答案的反驳。

这在ap:dataTable (Primefaces 5.3)<f:facet name="footer">的选定项目中对我有用:p:column

...

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

于 2016-11-07T01:10:59.600 回答
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>

点击这里,查看primefaces的网页

于 2017-05-07T05:32:42.313 回答
0

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

<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>
于 2020-12-20T11:11:54.150 回答
-1

为什么不将页脚的内容包含在具有 render 属性的 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一起使用。

于 2012-05-24T17:16:41.530 回答
-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>
于 2014-09-10T14:04:11.583 回答