添加第二个条目后,从 AEM multifieldpanel 对话框获取属性停止工作

Getting properties from AEM multifieldpanel dialog stops working when a second entry is added

我创建了一个 AEM 对话框,提示用户输入一组链接和标签。 这些链接和标签存储在 jcr 节点中,用于生成菜单。

为了避免必须创建自定义 xtype,我使用 acs-commons multifieldpanel 解决方案,它使我能够嵌套子项在 fieldConfig 节点下。

这只适用于一对 Label/Link,但当我添加第二对时 - 属性 无法再获取,因为它 returns 而不是字符串字符串哈希码。

multifieldpanel在jcr节点生成的属性是String类型,在CRXDE中检查时正确填写。当我尝试从 Sightly HTML 文件中获取值时出现问题。

代码

对话框:

Definitions.js:

"use strict";

use(function () {
  var CONST = {
    PROP_URLS: "definitions",
  };

  var json = granite.resource.properties[CONST.PROP_URLS];
  log.error(json);

  return {
    urls: json
  };
});

日志输出

多字段面板中有 1 个元素

jcr节点变量内容

日志输出

多字段面板中的多个元素

jcr节点变量内容

日志输出

结论

一旦 multifieldpanel 有多个组件并存储它,当访问 属性 节点时 returns 字符串哈希码而不是 属性 的值。

一位同事指出我应该使用 MultiFieldPanelFunctions class 来访问属性,但我们正在使用 HTML+Sightly+js 并试图避免。jsp 文件不惜一切代价。在JavaScript中,此功能不可用。有谁知道如何解决这个问题?

这是因为,当多字段中有单个项目时,它 returns 一个 String,而当有更多时,它 returns 一个 String[]比配置的单个项目。

始终使用以下语法将 属性 作为字符串数组读取。

var json = granite.resource.properties[CONST.PROP_URLS] || [];

此外,您还可以使用 TypeHints 来确保您的对话框始终将值保存为 String[],无论是配置的单个项目还是多个项目。

不要忘记 JS 中的 use() 被编译成 Java 字节码,如果您正在阅读 Java "primitives",请确保将它们转换为 JS 类型.这是 Rhino 微妙之处的一部分。

另一方面,我倾向于不使用花岗岩。*因为没有在任何地方记录它们,所以我使用 Sightly 全局对象来代替 https://docs.adobe.com/content/docs/en/aem/6-0/develop/sightly/global-objects.html

要访问属性,我使用 properties.get("key")

希望对您有所帮助。