FreeMarker如何为Iterator实现.iterator()?has_content
?
它是否尝试获取第一个项目以决定是否渲染,
它是否保留了迭代次数?或者它是否开始另一次迭代?
我找到了这个
static boolean isEmpty(TemplateModel model) throws TemplateModelException
{
if (model instanceof BeanModel) {
...
} else if (model instanceof TemplateCollectionModel) {
return !((TemplateCollectionModel) model).iterator().hasNext();
...
}
}
但我不确定Freemarker包含Iterator
类型的内容。
是TemplateCollectionModel
吗?
答案 0 :(得分:1)
它没有获得第一个项目,只是调用hasNext()
,是的,使用默认的ObjectWrapper
(请参阅object_wrapper
配置设置),它将被视为一个TemplateCollectionModel
,只能列出一次。但是在2.3.24之前(当我写这篇文章时未发布),有一些需要注意的问题(见下文)。此外,如果您使用纯BeansWrapper
而不是默认ObjectWrapper
,则会出现故障(请参阅下文)。
故障(2.3.23及更早版本):如果您使用默认的ObjectWrapper
(您应该),并且Iterator
未在后续列表中重新获取,即相同已经包装的值被重用,那么它会告诉我Iterator
只能列出一次。
故障2,纯BeansWrapper
:即使Iterator
为空,也只会说它有内容。这也在2.3.24中已修复,但是,您需要创建BeansWrapper
本身(即,不是(仅)Configuration
)2.3.24 incompatibleImprovements
确定要活跃。
请注意<#list ...>...<#else>...</#list>
已经并且在所有情况下都有效(甚至在2.3.24之前)。
最后,至少,感谢您引起我的注意。我已经在2.3.24修正了这些因素。 (每晚可以在这里建造:https://github.com/apache/incubator-freemarker/tree/2.3-gae)