Создайте список фрагментов тимелист и отправьте его как параметр в другой фрагмент - PullRequest
0 голосов
/ 03 марта 2020

Можно ли статически инициализировать список фрагментов и передать их в качестве параметра другому фрагменту? Примерно так:

это:

<div th:fragment="links(name)" xmlns:th="http://www.w3.org/1999/html" th:remove="tag">
    <span th:replace="~{fthis::htmlIconTemplate(${name}, '')}"/>
</div>

<th:block th:replace="fragments/new/template1 :: standartTemplate('', ${content}, { {{~{this::links('live')}, ~{this::links('live')}}})">
</th:block>

template1:

<tr th:fragment="standartTemplate(mode, content, customFragments)" xmlns:th="http://www.w3.org/1999/xhtml">
<th:block th:replace="${customFragments.get(1)}"/>
</tr>

1 Ответ

0 голосов
/ 03 марта 2020

Я не уверен, что это полностью отвечает на ваш вопрос. В приведенном ниже примере сердце решения - это строка:

<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]}__">

Заключительная мысль

Если реорганизация шаблонов и фрагментов позволит вам упростить и избежать этой сложности, то я бы выступать за это, а не за это. Но я не знаю более широкого контекста, так что, возможно, это не вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...