如何在 Freemarker(FTL) 中创建类似的循环 在 freemarker 中我有这样的声明:
<#if myVariable?? >
// do stuff
</#if>
我想将其转换为 while 循环,可以吗?
我想复制的Javascript代码
while (myVariable != null) {
// do stuff
}
如果不可能,Freemarker 中的递归方法是怎样的?
模板语言仅支持通过
#list
循环。因此,如果您需要执行这种循环,解决方法是:
<#list 0..1000000000 as _>
<#if exitCondition><#break></#if>
...
</#list>
您可以使用
macro
进行递归:
<#macro doStuff>
<#if myVariable?? >
// do stuff
<@doStuff/>
</#if>
</#macro>
<@doStuff/>
为了完成图片,以函数形式实现,使用其他函数作为输入进行处理并评估继续或不继续的条件:
<#function while(fn, input, condition)>
<#if !fn?is_directive>
<#return 'No processing function given!' />
</#if>
<#if !condition?is_directive>
<#return 'No condition function given!' />
</#if>
<#local result = fn(input) />
<#if (condition(result)>
<#return result />
<#else>
<#return while(fn, result, condition) />
</#if>
</#function>
<#-- Helper functions that would do the processing and provide the condition -->
<#function $length(input = '', max = 6)>
<#return (input?length >= max) />
</#function>
<#function $add(input = '')>
<#return input?right_pad(input?length+1, 'x') />
</#function>
${while($add, 'ab', $length)}
=> 'abxxxx'
请注意,如果退出条件错误并导致无限循环,使用这些方法中的任何一种都可能会关闭服务器,就像在所有其他语言中一样;)