循环变量内置函数

目录

注意:循环变量内建函数从 FreeMarker 2.3.23 版本开始存在。

这些内建函数只能用于 list 和 items 指令的循环变量 (也可以用于已经废弃的 foreach 指令)。下面是一些说明 (loopVar?index 在可以列表的值中进行迭代,返回从0开始的索引):

<#-- Note: x is a loop variable -->
<#list ['a', 'b', 'c'] as x>
  ${x?index}
</#list>

输出结果:

0
1
2

当 list 指令不指定循环变量时, 这些内建函数就作用于 items 指令的循环变量:

<#list ['a', 'b', 'c']>
  <ul>
   <#items as x>
     <li>${x?index}</li>
   </#items>
  </ul>
</#list>

循环变量内建函数仅仅用于循环变量的名字,所以它们可以识别相关进行的迭代。它们不读取循环变量的值。因此,这就会有解析错误:

<#list ['a', 'b', 'c'] as x>
  <#assign y = x>
  ${y?index} <#-- ERROR: y isn't a loop variable -->
</#list>

counter

从 FreeMarker 2.3.23 版本开始可用。

返回当前迭代 (由循环变量名称识别) 从1开始的索引。

<#list ['a', 'b', 'c'] as i>
  ${i?counter}: ${i}
</#list>

输出结果:

  1: a
  2: b
  3: c

注意:要从0开始的索引,请使用 index 内建函数。

has_next

从 FreeMarker 2.3.23 版本开始可用。

辨别循环项是否是当前迭代 (由循环变量名称识别) 的最后一项。

<#list ['a', 'b', 'c'] as i>
    ${i?has_next?c}
</#list>

输出结果:

true true false

使用逗号等隔开循环项,请使用 <#sep>separator</#sep> 来代替 <#if var?has_next>separator</#if>,这样可读性更强。此外 </#sep> 经常被忽略,比如在 <#list ... as var>...${var}...<#sep>separator</#list> 中。例如:

<#list ['a', 'b', 'c'] as i>
    ${i}
    <#sep>c</#seq>
</#list>

注意:如果需要对该内建函数取反,请使用 var?is_last 来代替 !var?has_next, 因为它的可读性更强。

index

从 FreeMarker 2.3.23 版本开始可用。

返回当前迭代 (由循环变量名称识别) 从0开始的索引。

<#list ['a', 'b', 'c'] as i>
  ${i?index}: ${i}
</#list>

输出结果:

  0: a
  1: b
  2: c

注意:需要从 1 开始的索引,请使用 counter 内建函数。

is_even_item

从 FreeMarker 2.3.23 版本开始可用。

辨别循环项是否是当前迭代 (由循环变量名称识别) 间隔 1 的奇数项。

<#list ['a', 'b', 'c', 'd'] as i>
${i?is_even_item?c}
</#list>

输出结果:

false
true
false
true

注意:要将表格进行行间变色等操作,请使用 var?item_parity 或 var?item_cycle(...) 来代替。

is_first

从 FreeMarker 2.3.23 版本开始可用。

辨别循环项是否是当前迭代 (由循环变量名称识别) 的第一项。

<#list ['a', 'b', 'c'] as i>
${i?is_first?c}
</#list>

输出结果:

true
false
false

is_last

从 FreeMarker 2.3.23 版本开始可用。

辨别循环项是否是当前迭代 (由循环变量名称识别) 的最后一项。

<#list ['a', 'b', 'c'] as i>
${i?is_last?c}
</#list>

输出结果:

false
false
true

如果需要对该内建函数取反,请使用 var?has_next 来代替 !var?is_last, 因为它的可读性更强。

使用逗号等隔开循环项,请使用 <#sep>separator</#sep> 来代替 <#if var?has_next>separator</#if>,因为它的可读性更强。此外 </#sep> 经常被忽略,比如在 <#list ... as var>...${var}...<#sep>separator</#list> 中。

is_odd_item

从 FreeMarker 2.3.23 版本开始可用。

辨别循环项是否是当前迭代 (由循环变量名称识别) 间隔1的偶数项。

<#list ['a', 'b', 'c', 'd'] as i>
${i?is_odd_item?c}
</#list>

输出结果:

true
false
true
false

注意:要将表格进行行间变色等操作,请使用 var?item_parity 或 var?item_cycle(...) 来代替。

item_cycle

从 FreeMarker 2.3.23 版本开始可用。

这是 item_parity 内建函数更为通用的版本,这里可以指定何值来代替 "odd" 和 "even"。 它也允许多余两个值来循环。

<#list ['a', 'b', 'c', 'd', 'e', 'f', 'g'] as i>
  <tr class="${i?item_cycle('row1', 'row2', 'row3')}">${i}</tr>
</#list>

输出结果:

  <tr class="row1">a</tr>
  <tr class="row2">b</tr>
  <tr class="row3">c</tr>
  <tr class="row1">d</tr>
  <tr class="row2">e</tr>
  <tr class="row3">f</tr>
  <tr class="row1">g</tr>

一些细节:

  • 参数的个数至少是1个,没有上限。

  • 参数的类型是任意的,无需只是字符串。

注意:如果需要"odd" 和 "even",请使用 item_parity 内建函数 来代替。

item_parity

从 FreeMarker 2.3.23 版本开始可用。

基于当前迭代(由循环变量名称识别)间隔为1的索引的奇偶性, 返回字符串值 "odd" 或 "even"。 这通常用于表格中行间的颜色变换:

<#list ['a', 'b', 'c', 'd'] as i>
  <tr class="${i?item_parity}Row">${i}</tr>
</#list>

输出结果:

  <tr class="oddRow">a</tr>
  <tr class="evenRow">b</tr>
  <tr class="oddRow">c</tr>
  <tr class="evenRow">d</tr>

注意:请使用 item_parity_cap 内建函数 来大写 "Odd" 和 "Even"。请使用 item_cycle 内建函数 来指定自定义值,或多于两个值。

item_parity_cap

从 FreeMarker 2.3.23 版本开始可用。

基于当前迭代 (由循环变量名称识别) 间隔为1的索引的奇偶性,返回字符串值 "Odd" 或 "Even" (请注意大写)。

<#list ['a', 'b', 'c', 'd'] as i>
  <tr class="row${i?item_parity_cap}">${i}</tr>
</#list>

输出结果:

  <tr class="rowOdd">a</tr>
  <tr class="rowEven">b</tr>
  <tr class="rowOdd">c</tr>
  <tr class="rowEven">d</tr>

注意:请使用 item_parity 内建函数 来小写 "odd" 和 "even"。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号