我使用多字段功能在AEM中创建了一个自定义组件。但是,它会自动将值放在长字符串中,逗号介于两者之间。
我已经使用自定义JS文件获取了数组中的值,但仍然无法弄清楚如何将它们分开或列出来。
我不确定我是否可以在我的JS文件或使用data-sly-repeat或data-sly-list引用JS的HTL文件的循环内完成此操作
我希望每个值都是一个单独的链接标记,输入值为href。
这里是js文件:
"use strict";
use(function() {
var csspath = properties["csspath"];
var links = "";
for(var i = 0; i < csspath.length; i++) {
links += csspath[i]
}
return {
linkarray: links
};
});
以及引用它的html:
<sly data-sly-use.csslinks="csslinks.js" />
${csslinks.linkarray}
现在html打印出来只是
test1test2
但我希望它显示为
<link href="test1.css" />
<link href="test2.css" />
无需用户实际输入<link href=.... />
我尝试在JS文件中添加html语法,如此...
for(var i = 0; i < csspath.length; i++) {
links += '<link href="' + csspath[i] + '.css" />'
}
甚至只是
for(var i = 0; i < csspath.length; i++) {
links += csspath[i] + "<br />"
}
但每次都会出错
答案 0 :(得分:1)
我通常避免使用WCM使用API来支持Sling模型,而且在编写本文时我手头没有AEM实例,但这里有一些您可能会发现有帮助的一般提示。
在您发布的WCM使用代码中:
"use strict";
use(function() {
var csspath = properties["csspath"];
var links = "";
for(var i = 0; i < csspath.length; i++) {
links += csspath[i]
}
return {
linkarray: links
};
});
您正在根据从页面属性绑定中获取的数组构建字符串。既然你的目标是构建HTML元素,那么这是一个不必要的步骤。
相反,返回数组并在HTL脚本中迭代它。 HTL是您应该构建表示层的地方。
"use strict";
use(function() {
var cssPaths = properties["csspath"];
return {
linkArray: cssPaths
};
});
然后,在您的HTL脚本中,迭代数组,呈现HTML。
<link data-sly-use.csslinks="csslinks.js"
data-sly-repeat.link="${csslinks.linkArray}" href="${link}" />
查看data-sly-repeat上的文档。
为了使其更简单,您可以使用开箱即用的properties
绑定并完全跳过WCM使用。该类型未在JS或HTL代码中的任何位置显式命名,但作为字符串数组(String[]
)保存在内容存储库中的属性可由HTL本身处理。如果您在对话框中使用granite/ui/components/foundation/form/multifield
,这应该足够了:
<link data-sly-repeat.link="${properties['csspath']}" href="${link}" rel="stylesheet" />
现在,这解释了如何实现您在HTL中尝试做的事情...... 然而,首先以这种方式输出CSS链接似乎是一个可疑的想法。
包含CSS文件通常不是AEM项目上的手动过程。您应该做的是将CSS组织到clientlibs中,在呈现页面的组件中声明依赖项,并让AEM为您提供正确的CSS和JS代码。