这可能是因为您使用的是复合多字段(查看针对多字段的属性
composite="{Boolean}true"
),它通常将表单内容处理为复合内容,并在当前组件下创建子节点来保存属性值。
true 将表单内容值处理为复合值。
复合多字段支持嵌套另一个多字段(复合或 不是)。但非复合不支持嵌套。
例如,给定字段的名称属性是地址,并且 后代字段具有以下名称属性值:
street1
street2
postcode
city/name
city/state
city/country/name
gps/lat
gps/long
它将在存储库中保存以下结构:
+ addresses + item0
- street1
- street2
- postcode
+ city
- name
- state
+ country
- name
+ gps
- lat
- long + item1
- street1
- street2
- postcode
+ city
- name
- state
+ country
- name
+ gps
- lat
- long
由于
properties
对象仅保存当前资源的属性,因此 ${properties.awards}
将为 null,因此它不会显示任何内容。
创建 Sling 模型或 Java / Javascript 使用 API 类获取列表然后在 HTL 文件中使用它会更容易。
JS 使用 API 示例
"use strict";
use(function () {
var awards = resource.getChild("awards").listChildren();
return {
awards: awards,
};
});
HTL 代码示例
<sly data-sly-use.children="children.js">
<ul data-sly-list.award="${children.awards}">
<li>${award.type}</li>
</ul>
<sly>
请注意,
properties
对象是ValueMap的实例,仅返回当前资源的属性。由于多字段值存储为子资源,因此您需要先访问子资源,然后再访问其属性。
返回复合多字段项目列表的动态吊索模型是理想的选择,因为它接受节点名称参数。
package com.myproject.core.models;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.Model;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.util.Collections;
import java.util.Iterator;
@Model(adaptables = SlingHttpServletRequest.class, adapters = MultiField.class)
public class MultiField {
private Iterator<Resource> nodesItemList;
@Inject
private String multifieldNodeName;
@Inject
private Resource resource;
@PostConstruct
public void activate() {
nodesItemList = Collections.emptyIterator();
Resource multiFieldNode = resource.getChild(multifieldNodeName);
if (multiFieldNode != null) {
nodesItemList = multiFieldNode.listChildren();
}
}
public Iterator<Resource> getItemsList() {
return nodesItemList;
}
}
有关更多信息和示例,请参阅我的 Multifield Component 博客文章。