如何在AEM 6.2的Sightly中访问由Map组成的List
在Sightly中访问List
嘿,我来帮你搞定在Sightly里访问List中Map元素的事儿!先提一句,你给的Java代码里有几个小笔误,我先帮你修正过来,这样后面的演示更准确:
// 修正后的Java数据初始化代码 List<Map<String, Object>> listOfMap = new ArrayList<>(); Map<String, Object> hmap1 = new HashMap<>(); hmap1.put("name", "Rob"); hmap1.put("class", "I"); listOfMap.add(hmap1); // 你原来的代码漏加这个元素到List里啦 Map<String, Object> hmap2 = new HashMap<>(); // 这里把subjects改成实际的Map而非字符串,后续访问更方便 Map<String, String> subjectsMap = new HashMap<>(); subjectsMap.put("subject1", "Maths"); subjectsMap.put("subject2", "English"); hmap2.put("subjects", subjectsMap); listOfMap.add(hmap2);
接下来分两种场景讲Sightly里的实现:
1. 遍历整个List,逐个访问Map元素
首先要确保你的listOfMap已经作为模型属性传递到Sightly模板(比如在AEM中通过Model类暴露该属性)。之后用data-sly-list指令遍历List,再通过点语法访问Map中的键值:
<!-- Sightly模板代码 --> <div class="list-container" data-sly-list.mapItem="${model.listOfMap}"> <div class="map-item"> <!-- 先判断属性是否存在,避免空值报错 --> <p data-sly-test="${mapItem.name}">姓名:${mapItem.name}</p> <p data-sly-test="${mapItem.class}">班级:${mapItem.class}</p> <!-- 访问嵌套的subjects Map --> <div data-sly-test="${mapItem.subjects}"> <p>科目1:${mapItem.subjects.subject1}</p> <p>科目2:${mapItem.subjects.subject2}</p> </div> </div> </div>
2. 直接访问List中指定索引的Map元素
如果不需要遍历,只想访问List中特定位置的Map元素,可以用索引语法直接定位,再结合点语法访问Map键值:
<!-- 访问List中第一个元素的name --> <p>第一个元素的姓名:${model.listOfMap[0].name}</p> <!-- 访问List中第二个元素的subjects --> <p>第二个元素的科目1:${model.listOfMap[1].subjects.subject1}</p>
额外说明:如果subjects是JSON字符串的情况
如果你的subjects必须是JSON格式的字符串(比如"{subject1:Maths, subject2:English}"),想要解析成Map访问的话,需要在Java端先把字符串解析为Map对象,或者使用Sightly的扩展函数(比如AEM中的json函数)来解析:
<!-- 使用AEM的json函数解析字符串为Map --> <div data-sly-test="subjectsObj = ${mapItem.subjects @ json=true}"> <p>科目1:${subjectsObj.subject1}</p> </div>
内容的提问来源于stack exchange,提问作者mchinta
相关产品推荐
相关产品推荐

