2009-02-12 77 views
3

我有一個宏需要幾個參數。其中一些是可選的,如果一個參數留空,它將被替換爲默認值。Velocity命名參數爲宏

現在的問題是如何使這個儘可能簡單的普通網頁設計師。除了我的例子以外,還有其他可能性來處理這種情況嗎?

實施例1:

這裏的明顯的問題是可選的值。

#macro (myTag $param1 $param2 $param3) 
... 
#end 

例2:

而且這裏的問題是一個可能的問題,當相同宏多次使用,所有變量都沒有重新設置。

#set ($param1="value1") 
#set ($param2="value2") 
#set ($param3="value3") 

#macro (myTag) 
... 
#end 

回答

6

從Velocity 1.6起,不支持可選參數或命名參數。最近有一個補丁提交了這個功能,所以我們可能會在未來的版本中看到它。

與此同時,考慮通過一個列表或值的地圖。例如,你可以在地圖上則params的傳遞如下(需要速度1.5或更大):​​

#macro(myMacro $p) 
    item 1: $p.param1 
    item 2: $p.param2 
#end 

#set($params = {"param1" : "val1", "param2":"val2"}) 
#myMacro($params) 

顯示:

item 1: val1 
item 2: val2 

要處理的可選參數,使用宏內的#if檢查爲參數。在地圖中添加新元素有點麻煩。由於Java方法「put」返回一個值,所以你必須使用#set來處理返回值。 (否則它會顯示在結果文本中)。

#macro(myMacro $p) 
    #if(!$p.param1)#set($dummy = $p.put("param1", "default1"))#end 
    #if(!$p.param2)#set($dummy = $p.put("param2", "default2"))#end 
    #if(!$p.param3)#set($dummy = $p.put("param3", "default3"))#end 

    item 1: $p.param1 
    item 2: $p.param2 
    item 3: $p.param3 
#end 

#set($params = {"param1" : "val1", "param2":"val2"}) 
#myMacro($params) 

顯示器

item 1: val1 
item 2: val2 
item 3: default3