测试模板客户端中是否已定义 ui:insert

问题描述 投票:0回答:1

我想知道是否可以知道

ui:insert
是否在
ui:composition
中定义。

我知道我可以使用单独的

ui:param
来完成它,但只是想不使用它来保持简单并且不易出错。

示例

模板

...
<ui:insert name="sidebar" />

<!-- Conditionally set the class according if sidebar is present or not -->
<div class="#{sidebar is defined ? 'with-sidebar' : 'without-sidebar'}">
    <ui:insert name="page-content" />
</div>
...

第1页

...
<ui:define name="sidebar">
    sidebar content
</ui:define>

<ui:define name="page-content">
    page content
</ui:define>
...

第2页

...
<ui:define name="page-content">
    page content
</ui:define>
...
templates jsf-2 facelets
1个回答
13
投票

ui:param
对我来说是最好的方法。这只是以正确方式使用它的问题。作为一个简单的例子,我在这里定义了一个参数来指定是否有侧边栏。请记住,您可以在模板中定义默认插入定义,因此只需在其中声明它即可:

模板.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">

    <ui:insert name="sidebar">
        <!-- By default, there's no sidebar, so the param will be present.
            When you replace this section for a sidebar in the client template,
            the param will  be removed from the view -->
        <ui:param name="noSideBar" value="true" />
    </ui:insert>

    <div class="#{noSideBar ? 'style1' : 'style2'}">
        <ui:insert name="content" />
    </div>

</ui:composition>

然后这里有几个视图,一个使用侧边栏,另一个没有侧边栏。您可以对其进行测试,看看样式在浏览器中如何变化。您会注意到第二个中的

#{noSideBar}
没有值,它将在任何 EL 条件语句中计算为
false

page1.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets" template="/template.xhtml">
    <ui:define name="content">
        No sidebar defined? #{noSideBar}
    </ui:define>
</ui:composition>

page2.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets" template="/template.xhtml">
    <ui:define name="sidebar" />
    <ui:define name="content">
        No sidebar defined? #{noSideBar}
    </ui:define>
</ui:composition>

这样您只需要担心是否在客户端视图中包含侧边栏。

© www.soinside.com 2019 - 2024. All rights reserved.