【发布时间】:2023-03-26 02:57:01
【问题描述】:
有没有一种方法可以使用相同的数据在 HTL 中调用模型的相同实例? 我想在页面模型中创建一个对象,比如说一个字符串对象,然后在组件模型中使用它。 要创建 bean(或模型实例),我调用
<sly data-sly-use.model="myModel"/>
在页面和组件中 问题是我现在有 2 个实例和 2 组本地数据 - 这是我不想拥有的。
【问题讨论】:
标签: aem sling-models
有没有一种方法可以使用相同的数据在 HTL 中调用模型的相同实例? 我想在页面模型中创建一个对象,比如说一个字符串对象,然后在组件模型中使用它。 要创建 bean(或模型实例),我调用
<sly data-sly-use.model="myModel"/>
在页面和组件中 问题是我现在有 2 个实例和 2 组本地数据 - 这是我不想拥有的。
【问题讨论】:
标签: aem sling-models
SlingHttpServletRequest(一般来说)提供了SlingBindings的实例,其中包含对"currentPage"的引用(我使用的是静态字段WCMBindings.CURRENT_PAGE [dependency: groupId: com.adobe.cq.sightly, artifactId: @987654326 @,版本: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);
}
}
【讨论】:
cq-wcm-sightly-extension 应该部署在您的 AEM 实例上,可能是不同的版本。