如何在 Apache Freemarker 中通过宏显示列表条目的数据?

How can I display data of a list entry via a macro in Apache Freemarker?

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

<#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)!""} .

宏需要访问 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/>

通常在我的宏中,当我使用完整的 json 路径调用变量时,我的变量就会起作用,例如:data.title。但是,表达式 data.dogs[index].name 由于某种原因仍然不起作用。我猜这是因为我调用它的地方(在 dogs 列表中)

与此同时,我查看了命名空间文档并找到了解决方法:

.data_model.data.dogs[index].name

这使我能够分别访问狗的属性,而不必将整个狗传递为 json