添加第二个条目后,从 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节点变量内容
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 有多个组件并存储它,当访问 属性 节点时 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")
希望对您有所帮助。
我创建了一个 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节点变量内容
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 有多个组件并存储它,当访问 属性 节点时 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")
希望对您有所帮助。