如何在 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>#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
我将模板引擎 freemarker (v. 2.3.31) 与 java/spring 一起使用。 目标:在我的 <#list>#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