0

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

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

这仅适用于 1 个标签/链接对,但是当我添加第二个时 - 无法再获取该属性,因为它返回的不是字符串,而是字符串哈希码。

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

代码

对话: AEM 对话框

定义.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节点变量内容

  • definitions: {"listText": "facebook", "listPath": "/content/en"}

日志输出

  • {"linkText":"facebook","linkPath":"/content/en"}

多字段面板中的多个元素

jcr节点变量内容

  • definitions: {"listText": "facebook", "listPath": "/content/en"},{"listText": "google", "listPath": "/content/en"}

日志输出

  • [Ljava.lang.String;@7b086b97

结论

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

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

4

2 回答 2

2

这是因为,当多字段中有单个项目时,它返回 a String,而String[]当配置了多个单个项目时,它返回 a 。

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

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

此外,您还可以使用TypeHints来确保您的对话框String[]一如既往地保存值,无论是单个项目还是配置的多个项目。

于 2015-11-06T14:56:15.947 回答
0

不要忘记 JS 中的 use() 被编译成 Java 字节码,如果您正在阅读 Java“原语”,请确保将它们转换为 JS 类型。这是犀牛精妙之处的一部分。

另一方面,我倾向于不使用花岗岩。*因为它们没有记录在哪里,我使用 Sightly 全局对象而不是https://docs.adobe.com/content/docs/en/aem/6-0/开发/sightly/global-objects.html

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

希望这有帮助。

于 2015-11-06T16:16:04.623 回答