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指令,定义局部变量

 
posted @ 2021-12-10 12:57  培轩  阅读(532)  评论(0编辑  收藏  举报