Я не уверен, что это полностью отвечает на ваш вопрос. В приведенном ниже примере сердце решения - это строка:
<th:block th:replace = "__${#strings.listSplit(customFragments, ',')[1]}__">
Пример строится на этом, начиная с более простых случаев. Поскольку у меня нет более широкого контекста вашего кода, его, конечно, необходимо адаптировать к вашей конкретной ситуации c.
Настройка
Содержание из frags_demo.html
- помещается в папку resources
:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Fragments Demo</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h2>Fragments Demo</h2>
<h3>In-page fragment:</h3>
<div th:fragment="links(name)" th:remove="tag">
<div th:text="'Here is ' + ${name}"></div>
</div>
<h3>First example:</h3>
<!-- simple example, with a string not fragment names -->
<th:block th:replace = "/fragments/fragments_one.html :: fragment_a(
mode = 'a mode',
content = ${content},
customFragments = 'foo,bar,baz')">
</th:block>
<h3>Second example:</h3>
<!-- example with hard-coded fragment names -->
<th:block th:replace = "/fragments/fragments_one.html :: fragment_a(
mode = 'a mode',
content = ${content},
customFragments = '/frags_demo.html::links(\'foo\'),bar,baz')">
</th:block>
<h3>Third example:</h3>
<!-- example with hard-coded fragment names, using the template fragment -->
<!-- use the absolute fragment path & name - can't use 'this' -->
<th:block th:replace = "/fragments/fragments_one.html :: fragment_b(
mode = 'a mode',
content = ${content},
customFragments = '/frags_demo.html::links(\'foo\'),
/frags_demo.html::links(\'bar\'),
/frags_demo.html::links(\'baz\')')">
</th:block>
</body>
</html>
Содержимое fragments_one.html
- помещается в подпапку fragments
в папке resources
:
<!-- the customFragments parameter contains the string 'foo,bar,baz' -->
<th:block th:fragment="fragment_a(mode, content, customFragments)">
<th:block th:text="${'Fragment A from fragments_one.html'}">
</th:block>
<!-- use the Thymeleaf listSplit function to create a list -->
<!-- giving us ['foo', 'bar', 'baz'] -->
<!-- picking one of the items (the 2nd one - zero-indexed!): -->
<div th:with="frag=${#strings.listSplit(customFragments, ',')[1]}"
th:text="${frag}">
</div>
<!-- iterating through the entire list: -->
<div th:each="frag : ${#strings.listSplit(customFragments, ',')}">
<div th:text="${frag}"></div>
</div>
</th:block>
<th:block th:fragment="fragment_b(mode, content, customFragments)">
<div>The string representing the template:</div>
<div th:with="frag=${#strings.listSplit(customFragments, ',')[1]}"
th:text="${frag}">
</div>
<p/>
<div>The invoked template:</div>
<th:block th:replace = "__${#strings.listSplit(customFragments, ',')[1]}__">
</th:block>
</th:block>
Вывод
Когда вы переходите на страницу frags_demo
, в браузере отображается следующее:
Fragments Demo
In-page fragment:
Here is null
First example:
Fragment A from fragments_one.html
bar
foo
bar
baz
Second example:
Fragment A from fragments_one.html
bar
/frags_demo.html::links('foo')
bar
baz
Third example:
The string representing the template:
/frags_demo.html::links('bar')
The invoked template:
Here is bar
Это самая последняя строка (here is bar
), которая представляет результат параметризованного вызова фрагмента.
Пошаговое руководство
С помощью примеров я усложняю ситуацию, чтобы прояснить, как все работает. Ключевые моменты, на которые следует обратить внимание:
Thymeleaf передает каждый параметр фрагмента в виде строки. Поэтому мы используем встроенную функцию #strings.listSplit
, чтобы получить итеративный список. В моем примере это запятая (foo,bar,baz
). В зависимости от того, что заканчивается строкой, запятая может не подходить для вас.
Если вы не хотите перебирать весь список, вы можете выбрать любой элемент с помощью [n]
.
Затем в демоверсии мы заменим foo,bar,baz
тремя ссылками на фрагменты, чтобы сделать демо ближе к тому, что вы хотите.
Последний шаг - использование директивы предварительной обработки __${...}__
для обеспечения Селектор фрагмента обрабатывается как строка как th:replace
:
<th:block th:replace = "__${#strings.listSplit(customFragments, ',')[1]}__">
Заключительная мысль
Если реорганизация шаблонов и фрагментов позволит вам упростить и избежать этой сложности, то я бы выступать за это, а не за это. Но я не знаю более широкого контекста, так что, возможно, это не вариант.