我想知道是否可以知道
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>
...
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>
这样您只需要担心是否在客户端视图中包含侧边栏。