如何通过AEM的Javascript Use-API向HTL传递函数并带参调用?
解决AEM HTL中调用Use API方法的参数传递问题
首先得明确HTL(原Sightly)的核心规则:HTL不允许在EL表达式中使用括号()来调用函数,必须用@符号传递方法参数,这也是你一开始出现解析错误的直接原因。
不过你后续尝试@语法时出现参数传递异常,还有个更关键的问题:你传递的child.getName并不是页面名称的字符串,而是Page对象的getName()方法本身的引用!这就导致isSecurePage方法里,用pages.indexOf(pageName)去查找一个Method对象,自然找不到匹配项,一直返回false。
正确的写法示例
修正后的home.html
<sly data-sly-use.secure="./secure.js" /> <div class="row" data-sly-list.child="${currentPage.listChildren}"> <!-- 写法1:命名参数,和Use API方法的形参名对应,可读性更强 --> <sly data-sly-test="${secure.isSecurePage @ pageName=child.name}"> <a href="${child.path}.html">${child.name}</a> </sly> <!-- 写法2:单个参数可简化为位置参数 --> <!-- <sly data-sly-test="${secure.isSecurePage @ child.name}"> <a href="${child.path}.html">${child.name}</a> </sly> --> </div>
关键细节说明
- 正确获取页面名称:
HTL支持直接访问Java Bean的Getter属性,child.name等价于调用无参的child.getName()方法,会返回你需要的页面名称字符串;而child.getName只是引用了方法本身,不是执行后的结果。 - HTL方法调用语法:
调用Use API的方法时,用@来传递参数,多个参数用逗号分隔(比如${obj.method @ param1=val1, param2=val2}),单个参数可以简化为位置参数写法。
你的secure.js逻辑是完全正确的,只要修正HTL里的参数传递方式,就能正常匹配到目标页面了。
内容的提问来源于stack exchange,提问作者chamberlainpi
相关产品推荐
相关产品推荐

