我希望能够从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。
这样做的正确方法是什么?
答案 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>
#{message}
为空或null
时,“呈现否页脚 - 而不仅仅是空页脚;否则,请使用指定文字正确呈现页脚。”
答案 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方面定义了支持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>