概要
<#macro name(argName1, argName2, ... argNameN)> ... </#macro><#call name(argValue1, argValue2, ... argValueN)>
这里:
-
name:宏的名称(不是表达式) -
argName1,argName2等: 存储参数值的 局部变量 的名称(不是表达式) -
argValue1,argValue2, 等:表达式,参数的值
描述
Note:
这是 FreeMarker 2.1 版本的文档中宏还有宏它相关的指令。 这仍然可以用,但是已经被废弃了。你也许想阅读 FreeMarker2.2+ 版本的参考: macro, return,自定义指令调用
宏是关联名称的模板段。你可以在你的模板中的很多位置使用命名的代码段, 所以它可以在重复的任务中帮助你。宏可以有参数,这会在你调用它的时候影响生成的输出。
你可以使用 macro 指令来定义宏,之后你可以在整个模板中定义宏。
macro 指令本身不往输出中写任何东西,它只是用来定义宏。
例如这会定义一个名为 warning 的宏:
<#macro warning(message)>
<div align=center>
<table border=1 bgcolor=yellow width="80%"><tr><td align=center>
<b>Warning!</b>
<p>${message}
</td></tr></table>
</div>
</#macro>当你使用 call 指令和宏名称时,
宏定义体(在宏开始标签和结束标签之间)会被处理。例如,
这会调用名为 warning 的宏:
<#call warning("Unplug the machine before opening the cover!")>将会输出:
<div align=center>
<table border=1 bgcolor=yellow width="80%"><tr><td align=center>
<b>Warning!</b>
<p>Unplug the machine before opening the cover!
</td></tr></table>
</div>
给 call 指令传递的参数可以在宏定义体中作为 局部变量访问。
当调用宏时,必须指定和宏定义时指定的个数相同的参数。 例如,如果这是宏的定义:
<#macro test(a, b, c)>Nothing...</#macro>
那么这些是合法的宏调用:
<#call test(1, 2, 3)>
<#call test("one", 2 + x, [1234, 2341, 3412, 4123])>如果宏没有参数,那么可以忽略圆括号:
<#macro test>mooo</#macro> <#call test>
当你定义宏时,那么它在模板中就是可用的,你也只能在模板中来定义宏。 但是你可能想在更多模板中使用相同的宏。这种情况下你可以在公共文件中存储你定义的宏, 之后在所有你需要这些宏的模板中包含那个文件。
调用定义在模板下部的宏是不错的
(因为宏在解析时间定义,而不是执行时间)。然而,
如果宏定义被插入到 include 指令中,
它们知道 FreeMarker 执行 include 指令时才会可用。
你可以用 return 指令在
</#macro> 标签之前留下宏定义体。