添加第二个条目时,从AEM多字段面板对话框获取属性将停止工作

时间:2015-11-06 13:54:06

标签: cq5 aem sightly

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

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

这只适用于1个Label / Link对,但是当我添加第二个时 - 该属性不再被提取,因为它不是String,而是返回String哈希码。

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

代码

对话框: AEM Dialog

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
  };
});

日志输出

multifieldpanel中的1个元素

jcr节点变量内容

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

日志输出

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

multifieldpanel中的多个元素

jcr节点变量内容

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

日志输出

  • [Ljava.lang.String;@7b086b97

结论

一旦multifieldpanel有多个组件并存储它,当访问该属性时,该节点返回String哈希码而不是属性的值。

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

2 个答案:

答案 0 :(得分:2)

这是因为,当多字段中有单个项目时,它会返回String,当配置的项目不止一个时,它会返回String[]

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

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

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

答案 1 :(得分:0)

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

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

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

希望得到这个帮助。