我想知道是否可以知道ui:insert
中是否定义了ui:composition
。
我知道我可以使用单独的ui:param
来完成它,但只是想这样做而不是为了保持简单并且不易出错。
示例:
模板
...
<ui:insert name="sidebar" />
<!-- Conditionnaly 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>
...
答案 0 :(得分:10)
ui:param
对我来说是最好的方式。这只是以正确的方式使用它的问题。举个简单的例子,我在这里定义一个参数来指定是否有侧边栏。请记住,您可以在模板中定义默认插入定义,因此只需在其中声明:
<强>的template.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>
这样您只需要担心在客户端视图中包含侧边栏。