我如何有条件地渲染一个<ui:define>
?
模板中的数据取决于所需的<f:viewParam>
.
但是如果提供了无效的视图参数,则<ui:define>
不应呈现,因为应使用模板的默认内容。
我尝试使用<c:if>
但它不起作用。
我如何有条件地渲染一个<ui:define>
?
模板中的数据取决于所需的<f:viewParam>
.
但是如果提供了无效的视图参数,则<ui:define>
不应呈现,因为应使用模板的默认内容。
我尝试使用<c:if>
但它不起作用。
不可能有条件地渲染/构建<ui:define>
. 你只能为它的内容做。<ui:define>
模板中忽略外部的任何内容。
更好的是有条件地构建<ui:insert>
。在<ui:insert>
视图构建期间运行,因此无法通过通过设置的属性有条件地呈现它<f:viewParam>
。您只能<ui:insert>
使用条件视图构建时间标签(例如 JSTL)有条件地构建它(标签本身),而 JSTL<c:if>
反过来又直接检查原始请求参数(因此不检查<f:viewParam>
属性)。
在主模板中,它看起来像这样,假设仅存在请求参数就足够了(如果您需要执行验证,则需要在 EL 表达式中或在托管 bean 中进行,其中属性通过 预初始化@ManagedProperty("#{param.foo}")
。
例如,在主模板中:
<c:if test="#{not empty param.foo}">
<ui:insert name="content" />
</c:if>
<c:if test="#{empty param.foo}">
<p>Default content</p>
</c:if>
或者,更清晰但更详细
<c:choose>
<c:when test="#{not empty param.foo}">
<ui:insert name="content" />
</c:when>
<c:otherwise>
<p>Default content</p>
</c:otherwise>
</c:choose>
改为使用<ui:fragment>
。
<ui:define name="description">
<ui:fragment rendered="false">
<meta name="description" content="do not render" />
</ui:fragment>
</ui:define>