FreeMarker宏定义参数传递的问题
自定义了一个宏,用于在网页上生成单选钮,代码如下:
<#macro radios name choices checked = 'N/A'> <#list choices! as value, label> <#if checked == value> <label><input type="radio" name="${name}" value="${value!}" checked="checked">${label!}</label> <#else> <label><input type="radio" name="${name}" value="${value!}">${label!}</label> </#if> </#list> </#macro>
在实际调用时是这样的
<@radios 'enabled' {'1':'开启', '0':'关闭'} mobile.enabled />
由于在编写代码时没有向页面注入mobile对象,于是考虑提供一个默认值,考虑对象和属性都不存在,使用了括号的方式:
<@radios 'enabled' {'1':'开启', '0':'关闭'} (mobile.enabled)! />
结果页面出错了,出错的信息为 Expected a method or function, but this has evaluated to an extended_hash
原因分析:FreeMarker宏调用时传递参数时不能使用括号,括号被解释为方法/函数调用。
解决问题的方法:必须传递有效的mobile对象,如果其中属性enabled没有值其后可使用默认值(!),
<@radios 'enabled' {'1':'开启', '0':'关闭'} mobile.enabled! />
另外一种解决方法:如果没有有效的mobile对象,使用赋值语句时可使用带括号的默认值。
<#local mobileEnabled = (mobile.enabled)! /> <@radios 'enabled' {'1':'开启', '0':'关闭'} mobileEnabled />
这里使用local指令,不使用assign指令,定义局部变量