Iterator上的FreeMarker?has_content

时间:2015-10-24 03:44:20

标签: iterator freemarker

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吗?

1 个答案:

答案 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