gpt4 book ai didi

aem - Sightly 中是否有 requestScope 变量?

转载 作者:行者123 更新时间:2023-12-04 10:37:51 27 4
gpt4 key购买 nike

在 JSTL 中,您可以在组件中设置变量,这些变量可用于同一请求中的所有其他组件。在 AEM 中使用 sightly 是否有等效的方法在组件之间传递数据?

(我们正在研究的用例是我们希望一个组件知道何时通过另一个组件包含它,而不是拖入解析系统)。

最佳答案

假设“requestScope”是指 request attributes ,它们是作用域为请求的变量。

使用 Sightly's Use-API 可以轻松设置请求属性.例如,这允许缓存检索成本高且由同一请求的多个组件访问的对象。

Sightly 有意使复杂化的是在包含组件之前设置请求属性并在之后立即删除它们,如下面的 JSP 示例:

<% request.setAttribute("myAttribute", someContextualInfo); %>
<cq:include path="innerComponent"/>
<% request.removeAttribute("myAttribute") %>

我们不想鼓励这样做的原因是它不是一个干净的模式:它基本上包括使用全局变量作为资源之间通信的一种方式......全局变量并不是最佳实践,即使您之后再次删除它们。

尝试查看以下模式是否更适合您的需求:

1. 添加选择器

您可以传递一个点分隔列表 Sling selectors包括的组件:
<div data-sly-resource="${'innerComponent' @ addSelectors='foo.bar'}"></div>
myComponent例如,组件可以包含 foo.html , bar.html , 和 foo/bar.html将呈现选择器的不同组合的模板。但是您也可以根据选择器采取不同的行动,方法是通过 RequestPathInfo 以编程方式访问它们。 .

selectors 方法的好处是,您可以使用各种所需的选择器调用组件的内容节点,以选择所需的节点再现:
http://localhost:4502/content/my/content/node.foo.bar.html

关于这种方法需要注意的一件事是,如果您使用具有(理论上)无界值集的选择器,您首先会看到微妙的性能问题,然后最终会耗尽脚本解析器缓存。选择器应该只与(相对较小的)有界值集一起使用。

2.向上走

如果您只想根据包含它的父组件将上下文传递给某些组件,那么最好将问题颠倒过来并在子组件上向上遍历父节点树并采取相应措施。

例如,假设您想基于使用它的父组件向 listItem 组件添加一个 CSS 类,以便添加类似 list-item-<parent-component-name> 的内容。类到 listItem 的再现:
<li class="list-item list-item-user">User Name</li>

在 JSP 中,很容易按如下方式解决它:
<% request.setAttribute("parentClassName", "user"); %>
<cq:include path="list-item"/>
<% request.removeAttribute("parentClassName") %>

但这实际上不是必需的,因为子组件可以检查它的父组件是什么,并自己找出 parentClassName 的适当值是什么。应该。好处是可以直接调用该子组件(例如,通过 AJAX 更新用户列表)并且仍然可以正确呈现。

3.使用-API

现在,如果上述两种模式不符合您的需要,那么您可能除了使用请求属性之外别无他法。为此, you can follow the method described on that other answer .但尽量限制这种做法。

关于aem - Sightly 中是否有 requestScope 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25430981/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com