0

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

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

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

4

1 回答 1

1

SlingHttpServletRequest通常)提供了 的实例SlingBindings,其中包含对"currentPage"(我在示例中使用静态字段WCMBindings.CURRENT_PAGE[dependency: groupId: com.adobe.cq.sightly, artifactId: cq-wcm-sightly-extension, version: 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);
  }
}
于 2017-05-09T09:31:31.490 回答