Javascript Use-API可以用来设置属性吗

Can the Javascript Use-API be used to set properties

在 AEM 中我们可以使用 the Javascript Use-API to access properties and perform some actions on them

在此示例中,我们可以看到我们使用 properties.getjcr:content:

检索一些属性
use(function () {
    var Constants = {
        DESCRIPTION_PROP: "jcr:description",
        DESCRIPTION_LENGTH: 50
    };

    var title = currentPage.getNavigationTitle() || currentPage.getTitle() || currentPage.getName();
    var description = properties.get(Constants.DESCRIPTION_PROP, "").substr(0, Constants.DESCRIPTION_LENGTH);

    return {
        title: title,
        description: description
    };
});

但是是否还有一种方法可以通过 Use-API 以某种方式 set 属性?

Use-API 实际上是 Sling API 的一个相当笨拙的外观。尽管您使用 var 关键字定义变量,但底层实现使用您可能从 Java.

知道的 APIs

事实上,您正在使用的 properties 对象是由 ValueMap 支持的,这是一种不允许修改内容的通用地图实现。 Apache Sling 使用它来为程序员提供 read-only 访问资源属性的权限。

您可以通过 JavaScript Use API 在 JavaScript 文件中隐式使用的对象只是通过 JavaScript [=69] 公开的 Sling 对象=]Java 虚拟机上的时间。要弄清楚其中每一项的实际含义,您可以通读 cq:defineObjects and sling:defineObjects 的文档。本文档适用于 global.jsp 中使用的标记库,AEM 中所有 JSP 包含的基础 JSP 脚本,它们在 HTL(以前称为 Sightly)中相同。就个人而言,我总是发现 JavaScript Use API 与其 Java 对应物相比有点笨拙,因为 Sling API 没有用 [=54= 记录]在我看来,编写脚本并翻译 javadoc 中的概念是一个相当尴尬的过程。

理论上,您应该能够使您的资源适应a ModifiableValueMap并修改资源。可能是 counter-intuitive 的第一位是使资源适应给定的 class.

var mvm = resource.adaptTo(Packages.org.apache.sling.api.resource.ModifiableValueMap);
mvm.put("a", 42);

Packages 对象公开了来自 AEM、Sling 和 JCR API 的各种类型。坦率地说,我不确定哪些可用。

即使这可行,也有一些注意事项需要牢记。

您将 运行 跨越的另一个障碍是权限 - 您在 AEM 中呈现组件时使用的资源解析器通常是与请求关联的资源解析器,具体取决于查看组件的用户。如果用户不能保存在给定的位置,操作将不会成功。自然地,可以通过使用 ResourceResolverFactory 代表具有任意权限的服务用户获得自定义资源解析器。这不是我愿意使用 JS Use API.

直接放在单个文件中的东西

最后,也许最重要的是,通过 HTL 脚本调用 Use API 的 AEM 组件 不是我通常希望修改存储库内容的东西。对存储库的任何修改都可以更好地封装在 OSGi 服务中。然后可以将该服务连接到一个 servlet、一个工作流、一个计划的作业,如果您确实需要,还可以通过 Sling 模型或使用 API.

连接一个 AEM 组件。

这有一些有效的场景,比如使用脚本来呈现对 POST 请求的响应,但即便如此,我更愿意使用专用服务来封装 持久性 逻辑,仅使用 HTL 和使用 API 编写 演示 逻辑。

如果您确实选择了这种方式,请务必考虑这会如何影响您缓存渲染内容的能力 HTML,这对于 AEM 实施中的性能至关重要。想想是否有任何关于复制的后果。如果这种情况发生在 Publish 上,您将进入 user-generated 内容领域,它有自己的一套限制需要考虑。