AEM - 如何将数据传递给组件

AEM - How to pass data to a component

通常 AEM 组件从 JCR 节点检索其数据,但我想知道是否可以在 HTL 中将数据传递给它。当然,有 data-sly-resource,但据我所知,这种方式只能传递一个 JCR 节点。

所以在实际情况下,我在从其他地方检索的模型中获得了数据。但是我想使用现有组件。我知道数据必须至少与组件类型的模型匹配。

但是,如果我想使用的组件使用的模型注入了数据,如

@Inject
@Optional
String[] itemList;

所以在我固执的想法中,应该可以以某种方式传递一个字符串数组,比如

<div data-sly-resource="${myModel.aStringArray @ resourceType='my/component' }"></div>

但是就像上面提到的,这似乎只是为了传递节点。

有什么方法可以将数据直接传递给组件(除了创建模板)吗?

您可以以请求属性或选择器的形式传递附加信息

选择器

选择器是传递简单信息最直接的方式。这是一个可以传递的字符串数组。这对于可以充当标志 ex:

的数据非常有用
    组件
  • Variant/Mode
  • 列表中组件的索引(如果它包含在循环中)。
  • 构建手风琴、标签等内容时父级的 ID

这种方法是对选择器的滥用,但恕我直言,只要您知道自己在做什么,这就不是主要问题。

<article data-sly-resource="${'path/to/resource' @ selectors=['s1', 's2']}"></article>

您可以在包含组件的同时添加、替换或删除选择器。查看语法文档。 https://docs.adobe.com/content/help/en/experience-manager-htl/using/htl/block-statements.html#resource

请求属性

此选项允许您向组件请求添加自定义请求属性。这可用于将对象作为参数传递给组件,同时包含它们。

这些是标准的 http 请求属性,可以将它们的范围限定为 script/resource 包含的特定实例。要使用它,您最终将需要一个模型 class 或 use-js,因为几乎没有支持组合要在视线中传递的数据。

<sly data-sly-use.settings="com.adobe.examples.htl.core.hashmap.Settings" 
        data-sly-include="${ 'productdetails.html' @ requestAttributes=settings.settings}" />

https://docs.adobe.com/content/help/en/experience-manager-htl/using/htl/block-statements.html#request-attributes

还有一个办法。您可以使用 data-sly-use 在初始化时将其他参数传递给 Sling 模型。例如:

<div data-sly-use.model="${'com.model.Teaser' @ test='abc'}"

您可以从请求中读取模型中的变量 "test":

@PostConstruct
private void initModel() {
    String value = request.getAttribute("test");
    // value is 'abc'
}

为了使其正常工作,您需要确保您的吊带模型能够根据要求进行调整@Model(adaptables = SlingHttpServletRequest.class}