# 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. 字符串聯