我有以下代码:
<c:set var="res" value="${sling:getResource(resourceResolver, currentPage.path)}" />
<sling:listChildren resource="${res}" var="children" />
${children} length ${fn:length(children)}
<c:forEach var="child" items="${children}">
<li>here${child.path}</li>
</c:forEach>
我的目标是吐出我当前页面的三个孩子。当我打印出${children}
时,我得到一个对迭代器(org.apache.sling.resourceresolver.impl.helper.ResourceIteratorDecorator@3b93b521
)的对象引用,长度返回三。问题是我无法进入循环。根据 sling taglibs 文档,这个forEach
应该能够处理迭代器对象。我错过了什么吗?findResources
函数还返回一个ResourceIteratorDecorator
,当它应该是普通java.util.Iterator
时。
我确实找到了资源迭代器装饰器类,它扩展了Iterator<Resource>
,所以类本身应该不是问题。已知c:forEach
迭代器对象有问题吗?
尝试取出长度检查并允许 forEach 运行。
为了使 length 函数计算出迭代器中包含多少项,它必须在迭代器上调用 next(),直到它到达终点。 没有办法倒带迭代器,所以当你到达你的forEach时,已经没有项目了。
如果你需要知道长度,你可以使用varStatus对象:
<c:forEach var="child" items="${children}" varStatus="status">
<li>${status.index} here${child.path}</li>
</c:forEach>
您使用的是比我更新的Sling版本,但是如果我将ResourceResolver.listChildren的结果输入到c:forEach中,而没有${fn:length(children)}