如何在AEM 6.2中的页面和组件之间共享数据?

时间:2017-05-09 09:23:31

标签: aem sling-models

有没有办法可以使用相同的数据在HTL中调用相同的模型实例? 我想在页面模型中创建一个对象,让我们说一个String对象,然后在组件模型中使用它。 要创建bean(或模型实例),我调用

<sly data-sly-use.model="myModel"/>

在页面和组件中 问题是我现在有2个实例,有2组本地数据 - 我不想要的。

1 个答案:

答案 0 :(得分:1)

SlingHttpServletRequest(通常)提供SlingBindings的实例,其中包含对"currentPage"的引用(我使用静态字段WCMBindings.CURRENT_PAGE [dependency:groupId:在我的示例中,com.adobe.cq.sightly,artifactId:cq-wcm-sightly-extension,版本:1.2.30]。

我在我的示例中使用的Optional是一个Java 8类,可用于避免对null引用进行过多检查。

final Optional<Page> optional = Optional.ofNullable(request)
        .map(req -> (SlingBindings) req.getAttribute(SlingBindings.class.getName()))
        .map(b -> (Page) b.get(WCMBindings.CURRENT_PAGE));

简化/显式示例

Page getCurrentPageFromRequest(@Nonnull final SlingHttpServletRequest request) {
  final SlingBindings bindings = (SlingBindings) request.getAttribute(SlingBindings.class.getName())
  if (bindings == null) {
    return null;
  }
  return (Page) bindings.get(WCMBindings.CURRENT_PAGE);
}

在你的Sling模型中,你只需要调用

@Model(adaptables={ SlingHttpServletRequest.class, })
public class Model {

  public Model(@Nonnull final SlingHttpServletRequest request) {
    final Page currentPage = getCurrentPageFromRequest(request);
    // read properties.
  }

  Page getCurrentPageFromRequest(@Nonnull final SlingHttpServletRequest request) {
    final SlingBindings bindings = (SlingBindings) request.getAttribute(SlingBindings.class.getName())
    if (bindings == null) {
      return null;
    }
    return (Page) bindings.get(WCMBindings.CURRENT_PAGE);
  }
}