是否有Sight变量?

Jam*_*eld 7 aem sightly

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

(我们正在研究的用例是我们希望一个组件通过另一个组件包含它而不是拖入一个解析器时所知道的位置).

Gab*_*alt 10

假设使用"requestScope"意味着请求属性,这些属性是作用于请求的变量.

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

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

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

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

试着看看以下模式是否不能更好地满足您的需求:

1.添加选择器

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

<div data-sly-resource="${'innerComponent' @ addSelectors='foo.bar'}"></div>
Run Code Online (Sandbox Code Playgroud)

myComponent然后,该组件可以例如包含a foo.html,a bar.htmlfoo/bar.html模板,该模板将呈现选择器的不同组合.但是,您也可以通过以编程方式通过RequestPathInfo访问它们来基于选择器采取不同的行为.

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

http://localhost:4502/content/my/content/node.foo.bar.html
Run Code Online (Sandbox Code Playgroud)

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

2.走起来

如果您只想根据包含它的父组件将上下文传递给某些组件,那么最好将问题颠倒过来并在子组件上向上移动父节点树并相应地执行操作.

想象一下,例如,您想基于使用它的父组件将一个CSS类添加到listItem组件,以便将类似list-item-<parent-component-name>类添加到listItem的再现:

<li class="list-item list-item-user">User Name</li>
Run Code Online (Sandbox Code Playgroud)

在JSP中,很有可能解决它如下:

<% request.setAttribute("parentClassName", "user"); %>
<cq:include path="list-item"/>
<% request.removeAttribute("parentClassName") %>
Run Code Online (Sandbox Code Playgroud)

但这实际上没有必要,因为子组件可以检查它的父组件是什么,并自己弄清楚parentClassName应该是什么的适当值.那么好处是可以直接调用该子组件(例如通过AJAX来更新用户列表)并且仍然可以正确地呈现.

3.使用-API

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