2016-10-13 10 views
2

Thymeleaf 3 layoutsを使用してフラグメントに追加のコンテンツを追加したいのですが、それを行う方法がわかりません。Thymeleaf 3のフラグメントにコンテンツを追加する方法

:内容は以下のようにレンダリング

<head th:include="layout :: head(title=~{::title})"> 
    <title>Please Login</title> 
</head> 

<head th:fragment="head(title)"> 
    <title th:include="${title}">My App: </title> 
</head> 

次に使用して、上記のフラグメントを使用するテンプレートを持っている:例えば、私は次のようになりますlayoutという名前のフラグメントがしたいのですが

<head> 
    <title>Please Login</title> 
</head> 

テンプレートを変更して、次のようにレンダリングし、layoutテンプレートにMy App:を配置したいと思います。それを複製する必要はありません)。私は、これは、以下のものを使用して動作するように取得することができます

<head> 
    <title>My App: Please Login</title> 
</head> 

<head th:fragment="head(title)"> 
    <title th:include="${title}">My App: <th:block th:include="${title}"></th:block></title> 
</head> 

しかし、Thymeleafはth:includeの使用を阻止。 From the reference

そして、何番目の差です:挿入し、目:置き換え(と 番目は:3.0以降推奨されません、などが)?

誰かがどのようにベストプラクティスを使用して上記のように、それがレンダリングされるように(前述のように参照するには、これはth:includeを使用していないことを意味)私のテンプレートを修正する教えてもらえますか?

答えて

3

複雑さは、ここにあなたがあなたの<title>タグは(あなたの~{::title}とフラグメントの<title>タグでth:replaceと容易であろう)あなたのフラグメントに直接行きたくないという事実から来ています。代わりに、ここであなたが実際に豊かなあなたのフラグメントの<title>は、含まれているテンプレートから来るテキストコンテンツと説明します。ここ

キーは次のように、「このタグのテキストコンテンツを選択し、」を意味し、あなたのマークアップセレクタに/text()修飾子を使用することです:

<head th:include="layout :: head(title=~{::title/text()})"> 
    <title>Please Login</title> 
</head> 

(の完全なリファレンスのためhttp://www.attoparser.org/apidocs/attoparser/2.0.0.RELEASE/org/attoparser/select/package-summary.htmlを見ますあなたのtitle変数が単一のノード/イベントからなるFragmentオブジェクト、含むITextを含んでなるだろうマークアップセレクタ構文)

テキスト"Please Login"

あなたが言及しているように、th:includeは現在推奨されておらず、代わりにth:insertth:replaceが推奨されます。理由は、th:includeのメカニズムが完全に即時ではなく、一般的に誘発された誤解ではないように思われた(基本的には、多くの人が今はth:insertのように思った。さらに、th:includeは、望ましくない計算上の複雑さを加えました。

th:replaceは実際にはとなります。これは、実際にはのフラグメントをホストタグに置き換えます。 th:insertは、フラグメントをホストタグの本体に挿入します。よりシンプルなオプションのセット、IMHO。戻るあなたのコードに

、私はこのためth:replaceを使用してに向かって進化するだろう:

<head th:replace="layout :: head(title=~{::title/text()})"> 
    <title>Please Login</title> 
</head> 

そしてあなたのフラグメントのためとして、あなたのケースで、私はインライン化、ここではおそらく最も簡単なオプションのために行くだろう:

このケースでは、我々はこのような場合には、すなわち断片発現の結果(Fragmentを使用していることを
<head th:fragment="head(title)"> 
    <title>My App: [[${title}]]</title> 
</head> 

注変数は単なるStringを含有代わり断片の場合と同様10)、我々は単にth:textに相当インライン()を介して出力されます。しかしそれは、v3.0の新しいフラグメント表現の柔軟性の一部です。

あなたがインライン化が気に入らない場合、あなたが何かのために行くことができます:

<head th:fragment="head(title)"> 
    <title th:text="|My App: ${title}|">My App</title> 
</head> 

そしてテンプレートを含む可能性がある場合何<title>タグを持っていないし、あなたがその可能性を確認したいと

<head th:fragment="head(title)"> 
    <title th:text="${title} ? |My App: ${title}| : _">My App</title> 
</head> 
:ちょうどフラグメントに送信されて何のタイトルが存在しない場合、あなたはまた、新しいノーオペレーショントークン(_)を使用することができますタイトルとしてMy Appテキストを使用

免責事項、per StackOverflowのルール:私はThymeleafのプロジェクトリーダーです。

+1

ああ、追加のコメント: '' head "'はおそらく ''タグと衝突する可能性があるため、おそらく最善のフラグメント名ではありません。注意マークアップセレクタは、 'th:fragment'属性なしでフラグメントに適用できます。 –

関連する問題