6

我想data-sly-resource用来包含一个资源,但前提是它存在,例如

<div class="pull-right" data-sly-resource="/content/blog/stats"></div>

如果资源不存在,则脚本执行将失败并显示以下错误消息:无法找到 servlet 来处理资源 /content/blog/stats 。从请求进度列表中,我可以看到它是SyntheticResource

TIMER_START{resolveServlet(SyntheticResource, type=null, path=/content/blog/stats)}

仅当资源存在时,如何有条件地包含资源?

4

3 回答 3

4

在这种情况下,最好的解决方案是让您的redis/stats组件正确处理Resource它应该呈现的情况SyntheticResource,或者更一般地说,不提供任何属性。

因此调用 Sightly 片段应该是:

<div class="pull-right" data-sly-resource="${'/content/blog/stats' @ resourceType='redis/stats'}"></div>

redis/stats即使/content/blog/stats资源不存在,这也会强制您的组件进行渲染(好吧,Sling 将返回 a SyntheticResource,就像您提到的那样)。

在您的redis/stats组件中,您可以尝试以下保护措施:

<div class="blog-stats" data-sly-test="${properties}">
<!--/* This whole block will only be rendered if properties is not empty */-->
</div>

div.blog-stats仅当属性映射不为空 [0] 时才会呈现。

[0] - https://github.com/Adobe-Marketing-Cloud/sightly-spec/blob/1.1/SPECIFICATION.md#225-test

于 2015-11-03T13:30:03.397 回答
2

如果您需要包含的资源(例如stats)是当前资源的子资源,那么这可能有效:

<div data-sly-test="${resource['stats/jcr:primaryType']}"
    class="pull-right" 
    data-sly-resource="stats"></div>
于 2016-05-24T15:24:49.587 回答
1

实现一个测试资源是否存在的使用脚本:

stats.js

use(function () {

    var hasStats = false;
    var stats = resource.getResourceResolver().getResource('/content/blog/stats');
    if ( stats != null && stats.getResourceType() == "redis/stats" ) {
        hasStats = true;
    } 

    return {
        hasStats: hasStats
    }
});

page.html

<sly data-sly-use.stats="stats.js"/>

<div data-sly-test="${stats.hasStats}" class="pull-right" data-sly-resource="/content/blog/stats"></div>

这有一个需要使用脚本的缺点,希望有一个更简单的方法。

于 2015-11-02T20:08:14.897 回答