7

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

(我们正在查看的用例是我们希望一个组件知道何时通过另一个组件包含它,而不是拖到 parsys 中)。

4

2 回答 2

10

假设“requestScope”是指请求属性,它们是限定在请求范围内的变量。

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

Sightly 故意使复杂的是在包含组件之前设置请求属性并在之后再次删除它们,如以下 JSP 示例:

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

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

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

1.添加选择器

您可以将点分隔的Sling 选择器列表传递给包含的组件:

<div data-sly-resource="${'innerComponent' @ addSelectors='foo.bar'}"></div>

然后,该myComponent组件可以例如包含 a foo.html、 abar.html和一个foo/bar.html模板,这些模板将呈现选择器的不同组合。但是您也可以通过RequestPathInfo以编程方式访问它们,从而根据选择器采取不同的行动。

selectors 方法的好处是,您可以使用各种所需的选择器调用组件的内容节点,以选择您希望的节点呈现方式:

http://localhost:4502/content/my/content/node.foo.bar.html

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

2. 向上走

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

例如,假设您想基于使用它的父组件将 CSS 类添加到 listItem 组件,以便将类似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

现在,如果上述两种模式不符合您的需要,那么您可能除了使用请求属性之外别无他法。为此,您可以按照其他答案中描述的方法进行操作。但尽量限制这种做法。

于 2014-08-22T12:54:00.470 回答
2

是的

请求范围的变量从“Scripting Sightly Engine 1.0.20”开始可用。这可能在 AEM 版本 6.3 之后可用。

但是,捆绑包可以手动安装,因为它是开源的。我还没有测试过这个。

请参考:https ://issues.apache.org/jira/browse/SLING-5812

于 2016-12-15T10:23:43.363 回答