1

我在 java/spring 中使用模板引擎 freemarker (v. 2.3.31)。目标:在我的 <#list></#list> 中,我想通过在另一个文件 (dog-detail.html.ftl) 中定义的宏来渲染每只狗的数据。

<#import "../base/templates/dog-detail.html.ftl" as detail>
...

<div class="content">
    <label>${(data.title)!""}</label>

    <#if (data.dogs)?has_content>
        <#list (data.dogs) as dog >

          <label>inside dog detail</label>

            <@detail.detail dog?index+1 />

        </#list>
        <#else>
        <label>no dogs here ...</label>
    </#if>
</div>

狗-detail.html.ftl:

<#macro detail index>

    <label>Hello I am the ${index}. dog. My name is ${(dog.name)!""} i am ${(dog.age)!""} years old</label>

</#macro>

我的json:

{
  "title": "hello i am a title",
  "dogs": [
    {
      "name": "Bello",
      "age": 5
    },
    {
      "name": "Bella",
      "age": 4
    },
    {
      "name": "Woof",
      "age": 10
    }
  ]
}

输出:

<div class="content">
  <label>hello i am a title</label>
  <label>inside dog detail</label>
  <label>Hello I am the 1. dog. My name is  i am  years old</label>
  <label>inside dog detail</label>
  <label>Hello I am the 2. dog. My name is  i am  years old</label>
  <label>inside dog detail</label>
  <label>Hello I am the 3. dog. My name is  i am  years old</label>
</div>

我从来没有遇到过访问宏中的数据的问题,但是每当我尝试访问宏中列表中的条目时,它都不起作用。我究竟做错了什么?

我试图将整个“狗”作为参数传递给宏,这不起作用,因为 freemarker 似乎无法将整个 json 节点作为参数处理。

目前的工作

将索引传递给宏时,可以像这样访问数据:${(data.dogs[index-1].name)!""}.

4

1 回答 1

0

宏需要访问dog变量;但是,只有索引被传递。更改宏以包含所述变量:

<#macro detail index dog>

    <label>Hello I am the ${index}. dog. My name is ${(dog.name)!""} i am ${(dog.age)!""} years old</label>

</#macro>

并将狗作为参数从主模板文件中传递,如下所示:

<@detail.detail dog?index+1 dog/>
于 2022-01-20T15:58:22.837 回答