# 15.4. Velocimacro 杂记
本节是关于Velocimacros的一个小型FAQ。本届内容会不时更新,所以请常来检查新的内容,
注 : 本节中, 'Velocimacro' 将简写为'VM'。
Q:是否可以使用指令directive 或者 VM 作为另一个VM的参数? 例如: \#center( \#bold("hello") )
A: 不行。指令不能用作指令的参数,而大多数情况下,作为实际的应用,VM就是指令。
不过也有一些办法。一个简单的做法是使用双引号来加工你的内容。所以,你可以这样:
```
#set($stuff = "#bold('hello')" )
#center( $stuff )
```
甚至可以节省一个步骤:
```
#center( "#bold( 'hello' )" )
```
请注意,后面这个例子中,参数是在VM内部被求值,不是在调用的那一层次上。换句话说,被传入的VM的参数是整个被传入的,并且在传入的VM内部被求值。所以我们可以这样做:
```
#macro( inner $foo )
inner : $foo
#end
#macro( outer $foo )
#set($bar = "outerlala")
outer : $foo
#end
#set($bar = 'calltimelala')
#outer( "#inner($bar)" )
```
这里,输入将会是:
```
Outer : inner : outerlala
```
因为"\#inner($bar)" 的求值发生在\#outer()内部,所以在\#outer() 内设置的$bar得值会是其使用的值。
这是一个有意的保护特征—参数按名称传递给VM,所以可以将象状态引用的东西传给VM ,比如:
```
#macro( foo $color )
<tr bgcolor=$color><td>Hi</td></tr>
<tr bgcolor=$color><td>There</td></tr>
#end
#foo( $bar.rowColor() )
```
rowColor() 被重复调用而不是一次。为避免如此,可以调用VM外部的方法,然后将值传递给VM.
```
#set($color = $bar.rowColor())
#foo( $color )
```
Q:是否可以通过\#parse()注册VM ?
A:当前, Velocimacros 在其首次在模版中使用前必须首先定义它。这意味着, #macro() 宣称应该在使用Velocimacros之前。
如果你想\#parse() 一个包含\#macro() 指令的模板,记住这个非常重要。因为\#parse() 在运行时发生,解析器在解析时要决定是否模版中一个看起来像VM的元素真是VM,所以解析一系列VM 宣称可能并不能如愿地工作的很好。为避免如此,可以简单地使用velocimacro.library 的办法,使Velocity 在启动时载入VM。
Q. 什么是VM自动载入(Velocimacro Autoreloading)?
A. 这是一个属性,在开发时使用,而不时运行时:
```
velocimacro.library.autoreload
```
默认值为false。当设置为true时,连同<type>.resource.loader.cache 属性设置为false(这里<type> 是使用的资源载入器的名称,比如'file') ,Velocity 引擎在你创建VM库文件是将自动载入其改变,这样你就不必将其导入servlet 引擎(或者应用程序)中,或者用其他手段来使其自动重新载入。
下面是一个简单的设置配置组合:
```
file.resource.loader.path = templates
file.resource.loader.cache = false
velocimacro.library.autoreload = true
```
注意在生产状态(运行时)不要使其打开。
- 1. 关于
- 2. 什么是Velocity?
- 3. Velocity 可以做什么?
- 3.1. Mud Store 示例
- 4. Velocity模板语言(VTL): 介绍
- 5. Hello Velocity World!
- 6. 注释
- 7. 引用
- 7.1. 变量Variables
- 7.2. 属性
- 7.3. 方法
- 8. 形式引用符Formal Reference Notation
- 9. 安静引用符Quiet Reference Notation
- 11. Case Substitution
- 12. 指令
- 12.1. #set
- 12.2. 字面字符串
- 12.3. 条件
- 12.3.1 If / ElseIf / Else
- 12.3.2 关系和逻辑操作符
- 12.4. 循环
- 12.4.1. Foreach 循环
- 12.5. 包含
- 12.6. 解析
- 12.7. 停止
- 12.10. 宏
- 12.10.1. Velocimacro 参数
- 12.10.2. Velocimacro 属性
- 12.10.3. Velocimacro Trivia
- 13. Getting literal
- 13.1. 货币字符
- 13.2. 转义 有效的 VTL 指令
- 13.3. 转义 无效的 VTL 指令
- 14. VTL 格式化问题
- 15. 其它特征和杂项
- 15.1. 数学特征
- 15.2. 范围操作符
- 15.3. 进阶:转义和!
- 15.4. Velocimacro 杂记
- 15.5. 字符串联