我创建了一个AEM对话框,提示用户输入一组链接和标签。 这些链接和标签存储在 jcr 节点中,用于生成菜单。
为了避免创建自定义xtype,我使用 acs-commons multifieldpanel 解决方案,这使我能够将子嵌套在fieldConfig节点下。
这只适用于1个Label / Link对,但是当我添加第二个时 - 该属性不再被提取,因为它不是String,而是返回String哈希码。
jcr节点中multifieldpanel生成的属性是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
};
});
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
一旦multifieldpanel有多个组件并存储它,当访问该属性时,该节点返回String哈希码而不是属性的值。
一位同事指出我应该使用MultiFieldPanelFunctions
类来访问属性,但我们正在使用HTML + Sightly + js并试图不惜一切代价避免使用.jsp文件。在JavaScript中,此功能不可用。有谁知道如何解决这个问题?
答案 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”)
希望得到这个帮助。