在 AEM 中我们可以使用 the Javascript Use-API to access properties and perform some actions on them .
在此示例中,我们可以看到我们使用 properties.get
从 jcr: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 以某种方式设置
属性吗?
最佳答案
Use-API 实际上是 Sling API 的一个相当尴尬的外观。尽管您使用 var
关键字定义变量,但底层实现使用您可能从 Java 中了解的 API。
事实上,您正在使用的 properties
对象是由 ValueMap
支持的。 ,一个不允许内容修改的通用 map 实现。 Apache Sling 使用它为程序员提供对资源属性的只读访问权限。
您可以通过 JavaScript Use API 在 JavaScript 文件中隐式使用的对象只是通过 Java 虚拟机上的 JavaScript 运行时公开的 Sling 对象。要弄清楚其中每一个实际上是什么,您可以阅读 cq:defineObjects
的文档。和 sling:defineObjects
。本文档涉及 global.jsp
中使用的标记库,这是 AEM 中所有 JSP 都包含的基本 JSP 脚本,它们在 HTL(以前称为 Sightly)中是相同的。就我个人而言,我一直发现 JavaScript Use API 与 Java 对应的 API 相比有点笨拙,因为 Sling API 没有考虑 JavaScript 的记录,并且在我看来,从 javadoc 翻译概念是一个相当尴尬的过程。
理论上,您应该能够将您的资源调整为 a ModifiableValueMap
并修改资源。第一个可能违反直觉的是使资源适应给定的类。
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 服务中。然后,该服务可以通过 Sling Models 或 Use API 连接到 servlet、工作流、计划作业以及 AEM 组件(如果您确实需要)。
有一些有效的场景,例如使用脚本来呈现对 POST 请求的响应,但即便如此,我还是宁愿使用专用服务来封装持久性逻辑,并且仅使用 HTL 和 Use API 来编写表示逻辑。
如果您确实选择这样做,请务必考虑这会如何影响您缓存渲染的 HTML 的能力,这对于 AEM 实现中的性能至关重要。考虑复制是否会产生任何后果。如果这种情况发生在发布上,那么您就进入了用户生成的内容领域,该领域有其自身的一系列限制需要考虑。
关于javascript - Javascript Use-API 可以用来设置属性吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72024953/