You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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>

关键细节说明

  1. 正确获取页面名称:
    HTL支持直接访问Java Bean的Getter属性,child.name等价于调用无参的child.getName()方法,会返回你需要的页面名称字符串;而child.getName只是引用了方法本身,不是执行后的结果。
  2. HTL方法调用语法:
    调用Use API的方法时,用@来传递参数,多个参数用逗号分隔(比如${obj.method @ param1=val1, param2=val2}),单个参数可以简化为位置参数写法。

你的secure.js逻辑是完全正确的,只要修正HTL里的参数传递方式,就能正常匹配到目标页面了。

内容的提问来源于stack exchange,提问作者chamberlainpi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:42