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

Mat*_*all 18 jsf primefaces jsf-2

我希望能够从PrimeFaces面板元素有条件地省略页脚:

<p:panel header="some text">
    <f:facet name="footer">
        #{message}
    </f:facet>
    <!-- ... -->
</p:panel>
Run Code Online (Sandbox Code Playgroud)

我希望该rendered属性可以工作:

<p:panel header="some text">
    <f:facet name="footer" rendered="#{!empty message}">
        #{message}
    </f:facet>
    <!-- ... -->
</p:panel>
Run Code Online (Sandbox Code Playgroud)

但页脚仍然呈现,内容空白.它似乎facet没有rendered属性:http://www.jsftoolbox.com/documentation/help/12-TagReference/core/f_facet.html.

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

Mat*_*all 14

我能够通过交换facet出来来解决这个问题attribute.总结一下:

这有效

<p:panel ...>
    <f:attribute name="footer" value="#{message}"/>
    <!-- ... -->
</p:panel>
Run Code Online (Sandbox Code Playgroud)

但这不起作用

<p:panel footer="#{message}">
    <!-- ... -->
</p:panel>
Run Code Online (Sandbox Code Playgroud)

这也不是

<p:panel ...>
    <f:facet name="footer">#{message}</f:facet>
    <!-- ... -->
</p:panel>
Run Code Online (Sandbox Code Playgroud)

也不是这个

<p:panel ...>
    <f:facet name="footer">
        <h:outputText value="#{message}" rendered="#{!empty message}"/>
    </f:facet>
    <!-- ... -->
</p:panel>
Run Code Online (Sandbox Code Playgroud)

通过"作品"我的意思是:

"渲染没有页脚 - 不只是一个空页脚 - 当它#{message}是空的时候null;否则,正确地使用指定的文本呈现页脚."


PrimeFaces论坛主题就这个问题

  • 无知有时是一种幸福.事实证明,facet实际上存储为属性(具有可以在其中声明UI组件的优点).很高兴知道. (4认同)
  • @BalusC:试验和错误 - 所以,当然,幸运的意外:)已经学习了JSF等人<3周(PrimeFaces <1周)我认为我还没有完全挖掘源代码. (2认同)

小智 8

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

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

<f:facet name="#{hideFooter == null or not hideFooter ? 'footer' : ''}">
     #{message}
</f:facet>
Run Code Online (Sandbox Code Playgroud)

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

<ui:param name='hideFooter' value='#{some rule}' />
Run Code Online (Sandbox Code Playgroud)

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


dig*_*oel 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>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 它确实仅在复合组件或标记文件中有用,因为它们基本上每次声明标记都被实例化/执行一次.但是,在普通视图中,您依赖于更多因素:例如,当EL依赖于某些JSF UIData /重复变量时,JSTL将不会按预期运行,因为在视图构建期间此信息不可用. (4认同)
  • 有趣.我想到了这一点,但由于我没有测试它的环境,我担心混合`c:if`不会像预期的那样表现.让我们看看它是否适用于OP的情况.:) (2认同)