Freemarker 中的 While 循环

问题描述 投票:0回答:3

如何在 Freemarker(FTL) 中创建类似的循环 在 freemarker 中我有这样的声明:

<#if myVariable?? >
  // do stuff
</#if>

我想将其转换为 while 循环,可以吗?

我想复制的Javascript代码

while (myVariable != null) {
  // do stuff
}

如果不可能,Freemarker 中的递归方法是怎样的?

freemarker
3个回答
3
投票

模板语言仅支持通过

#list
循环。因此,如果您需要执行这种循环,解决方法是:

<#list 0..1000000000 as _>
  <#if exitCondition><#break></#if>
  ...
</#list>

1
投票

您可以使用

macro
进行递归:

<#macro doStuff>
  <#if myVariable?? >
    // do stuff
    <@doStuff/>
  </#if>
</#macro>

<@doStuff/>

0
投票

为了完成图片,以函数形式实现,使用其他函数作为输入进行处理并评估继续或不继续的条件:

<#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'

请注意,如果退出条件错误并导致无限循环,使用这些方法中的任何一种都可能会关闭服务器,就像在所有其他语言中一样;)

© www.soinside.com 2019 - 2024. All rights reserved.