6

是否有关于如何<ui:define><ui:insert>.

模板 A:

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets">
    template A content<br/>
    <ui:insert name="content"/>
</ui:composition>

模板 B:

<ui:composition template="/resources/templates/A.xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <ui:define name="content">
        template B content<br/>
        <ui:insert name="content"/>
    </ui:define>
</ui:composition>

站点 1:

<ui:composition template="/resources/templates/B.xhtml">
    Site 1<br/>
    <ui:define name="content">
        site content<br/>
    </ui:define>
</ui:composition>

输出:

Site 1
site content

的内容<ui:define>取自站点 1,模板的内容未呈现。

站点 2:

<ui:composition template="/resources/templates/B.xhtml">
    Site 2<br/>
</ui:composition>

输出:

Site 2
template B content
template A content

的内容<ui:define>取自模板 B 和模板 A,奇怪的是,模板 B 的内容在模板 A 的内容之前呈现。

是否可以使用相同的名称覆盖<ui:define>新的<ui:insert>名称?

为嵌套创建新名称<ui:insert>是一种可能,但很难跟踪层次结构以及插入的位置。

4

1 回答 1

11

不幸的是,Facelets 不允许您“链接”插入/定义。

在您的第一个示例(站点 1insert中,模板 A 中有一个称为“内容”的单个。有两个definitions正在考虑;直接模板客户端(模板B)和模板B(站点1)的模板客户端。对于这种情况,Facelets 看不到模板 B 有另一个insert. 它只考虑两个竞争definitions“内容”,规则是最上面的一个获胜,即站点 1。

不过,您确实忘记将命名空间放在模板客户端上。您应该看到的输出是:

template A content
site content

即“模板A内容”在最低模板中,在insert标签之外。它将直接渲染。“网站内容”位于“内容”的最顶端definition

在第二个示例(站点 2definition )中,最顶层的模板客户端中根本没有。只有一个definition,并且在模板 B 中,因此将使用一个。您应该看到的输出是:

template A content
template B content

出于与第一个示例相同的原因,您将看到“模板 A 内容”,以及“模板 B 内容”,因为它是唯一的definition. 之后的嵌套第二个insert将被忽略。

为嵌套创建新名称是一种可能,但很难跟踪层次结构以及插入的位置。

真的是。正是出于这个原因,我在一年前为此创建了一个规范问题:https ://github.com/eclipse-ee4j/faces-api/issues/1008

If this particular functionality is important to you please vote and/or leave a comment.

于 2012-12-26T09:15:00.217 回答