自定义指令macro

宏参数的真实值是可以作为变量(person)放在宏定义体中的。使用预定义指令时,参数的值(=号后边的值)可以是FTL表达式。这样,不像HTML,"Fred"和"Batman"的引号就可以不用要了。<@greet person=Fred/>也意味着使用变量的值Fred作为person参数,而不是字符串"Fred"。当然参数值并不一定是字符串类型,也可以是数字,布尔值,哈希表,序列等…也可以在=号左边使用复杂表达式(比如someParam=(price + 50)*1.25)。

自定义指令可以有多个参数:

<#macro greet person color>
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>

 当调用这个宏的时候,你仅仅可以使用在macro指令中定义的参数,同时也必须给出在宏中定义所有参数的值。

 

给定默认值

很多情况下需要给一个参数指定一个相同的值,所以我们仅仅想在这个值发生变化后重新赋给变量。那么要达到这个目的,在macro指令中必须这么来指定变量:param_name=usual_value。

例如:

<#macro greet person color="black">
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>

 

根据FTL表达式规则,明白下面这一点是至关重要的,someParam=foo和someParam="${foo}"是不同的。第一种情况,是把变量foo的值作为参数的值来使用。第二种情况则是使用插值形式的字符串,那么参数值就是字符串了,这个时候,foo的值呈现为文本,而不管foo是什么类型(数字,日期等)的。看下面这个例子:someParam=3/4和someParam="${3/4}"是不同的,如果指令需要someParam是一个数字值,那么就不要用第二种方式。切记不要改变这些。

 

 

嵌套内容

自定义指令可以嵌套内容,和预定义指令相似:<#if ...>nested content</#if>。比如,下面这个例子中是创建了一个可以为嵌套的内容画出边框:

<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</td></tr></table>
</#macro>

 <#nested>指令执行位于开始和结束标记指令之间的模板代码段。

nested指令也可以多次被调用

例如:

<#macro do_thrice>
<#nested>
<#nested>
<#nested>
</#macro>
<@do_thrice>
Anything.
</@do_thrice>

嵌套的内容可以是任意有效的FTL,包含其他的用户自定义指令

例如:

<@border>
<ul>
<@do_thrice>
<li><@greet person="Joe"/>
</@do_thrice>
</ul>
</@border>

 在嵌套的内容中,宏的局部变量是不可见的

<#macro repeat count>
<#local y = "test">
<#list 1..count as x>
${y} ${count}/${x}: <#nested>
</#list>
</#macro>
<@repeat count=3>${y!"?"} ${x!"?"} ${count!"?"}</@repeat>

 将会打印:

test 3/1: ? ? ?
test 3/2: ? ? ?
test 3/3: ? ? ?

 因为y,x和count是宏的局部(私有)变量,从宏外部定义是不可见的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值