2009-02-12 79 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