【问题标题】:Nested template overwrite ui:default with ui:insert嵌套模板用 ui:insert 覆盖 ui:default
【发布时间】:2012-12-26 06:15:31
【问题描述】:

是否有关于如何用<ui:insert> 覆盖模板定义<ui:define> 的规则。

模板 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

&lt;ui:define&gt; 的内容取自站点 1,模板的内容未呈现。

站点 2:

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

输出:

Site 2
template B content
template A content

&lt;ui:define&gt; 的内容取自模板 B 和模板 A,奇怪的是,模板 B 的内容在模板 A 的内容之前呈现。

是否可以用相同名称的新&lt;ui:insert&gt; 覆盖&lt;ui:define&gt;

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

【问题讨论】:

    标签: templates jsf facelets


    【解决方案1】:

    很遗憾,Facelets 不允许您“链接”插入/定义。

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

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

    template A content
    site content
    

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

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

    template A content
    template B content
    

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

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

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

    如果此特定功能对您很重要,请投票和/或发表评论。

    【讨论】:

    • 我也喜欢这个功能!我猜新链接是这个:github.com/javaee/javaserverfaces-spec/issues/1008
    • @ASE 谢谢,我更新了帖子。我现在基本上可以自己将它添加到 JSF,但是由于目前没有活动的 EG 并且正在转移到 Eclipse 基金会,我必须看看如何准确地进行。
    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2017-05-26
    • 2019-03-27
    相关资源
    最近更新 更多