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>は 1 つの可能性ですが、階層と挿入が使用されている場所を追跡するのは困難です。

4

1 に答える 1

11

残念ながら、Facelets では、挿入/定義を「チェーン」することはできません。

最初の例 ( Site 1insert ) では、 「コンテンツ」と呼ばれるテンプレート A に単一のものがあります。definitions検討されているのは 2 つあります。直接テンプレート クライアント (テンプレート B) のそれと、テンプレート B (サイト 1) のテンプレート クライアントのそれ。この場合、Facelets はテンプレート B に別の があることを認識しませんinsert。「コンテンツ」をめぐって競合する 2 つだけを考慮definitionsし、ルールは一番上にあるサイト 1 が勝つというものです。

ただし、テンプレート クライアントに名前空間を配置するのを忘れていました。表示される出力は次のとおりです。

template A content
site content

つまり、「テンプレート A コンテンツ」は、insertタグの外側の最下位のテンプレートにあります。直接レンダリングされます。「サイトコンテンツ」は「コンテンツ」の一番上にdefinitionあります。

2 番目の例 (サイト 2 ) ではdefinition、最上位のテンプレート クライアントにはまったくありません。が 1 つだけありdefinition、それがテンプレート B にあるため、1 つが使用されます。表示される出力は次のとおりです。

template A content
template B content

最初の例と同じ理由で「テンプレート A コンテンツ」が表示され、唯一のdefinition. その後のネストされた秒insertは無視されます。

ネストされたものに新しい名前を作成することは 1 つの可能性ですが、階層と挿入が使用されている場所を追跡するのは困難です。

まったくそのとおり。まさにこの理由で、私は 1 年以上前にこのための仕様の問題を作成しました: https://github.com/eclipse-ee4j/faces-api/issues/1008

この特定の機能が重要な場合は、投票および/またはコメントを残してください。

于 2012-12-26T09:15:00.217 に答える