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

标签 javascript aem sling

在 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 以某种方式设置属性吗?

最佳答案

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/

相关文章:

javascript - 将 React + NodeJS + Express + MySQL 应用程序部署到 Heroku 只部署服务器而不是 React

aem - 使用 sightly 从 AEM 6.4 中的页面属性检索缩略图 URL

amazon-s3 - 将AEM配置为使用S3数据存储时,它将使蓝绿色部署更快吗?

javascript - 高效获取下拉列表中的选定选项(XHTML Select 元素)

javascript - 使用事件委托(delegate)来克服纯 JS 中的性能瓶颈

java - 由 : java. lang.ClassNotFoundException : net. com.myproject.core 找不到 sf.json.xml.XMLSerializer 引起 [35154]

java - 激活页面时,sling 事件处理程序仅响应一次

java - Sling scheduler 定期作业——作业会重叠吗?

javascript - 即使 console.log 位于进行更改的行之前,对象也会更改

java - 从 vanilla Adob​​e CQ5 生成 XML 的好方法是什么?