仅加载当前页面中的组件脚本

时间:2016-07-26 11:48:20

标签: cq5 aem

我想要实现的是,如果我有2个组件节点:

  • component1

    • clientlib
      • component1.js
  • component2

    • clientlib
      • component2.js

然后我将它们拖到page1中,然后当生成page1时,导航到page1时将只加载component1.js和component2.js。

我看到的一种方法是使用此处所述的自定义Tag Libraryhttp://www.icidigital.com/blog/best-approaches-clientlibs-aem-part-3/

我有两个问题:

1)AEM中是否有现成功能?

2)如果没有,创建此类自定义Tag Library的最简单方法是什么?

编辑:

假设没有能力只包含所有组件clientLib,而只加载那些添加到页面中的组件。

2 个答案:

答案 0 :(得分:2)

没有内置功能可以执行此操作。虽然我听说客户端栈基础设施正在被重新编写,所以我乐观地认为将来会添加类似的东西。

我们已经,并且我知道其他公司已经创建了一个"延迟脚本标记。"我们是一个非常简单的标记,它将一大块html视为clientlib包含,将其添加到一个唯一的列表中,然后在页脚的外部调用中,将它们一个接一个地吐出来。

这是扩展BodyTagSupport的简单标记实现的核心。然后在你的页脚中抓取属性并将其写出来。

public int doEndTag() throws JspException {
    SlingHttpServletRequest request = (SlingHttpServletRequest)pageContext.getAttribute("slingRequest");

    Set<String> delayed = (Set<String>)request.getAttribute(DELAYED_INCLUDE);

    if(delayed == null){
        delayed = new HashSet<String>();
    }

    if(StringUtils.isNotBlank(this.bodyContent.getString())){
        delayed.add(this.bodyContent.getString().trim());
    }

    request.setAttribute(DELAYED_INCLUDE, delayed);
    return EVAL_PAGE;
}

答案 1 :(得分:0)

从理论上讲,可行的方法是在页面组件/抽象页面组件中编写脚本,执行类似的操作 -

Step1:String path = currentPage.getPath()

步骤2:查询组件的此路径(一种方法是让主列表对sling执行包含子句:resourceType)

步骤3:用户资源解析器在步骤3中解析resourceType,这将为您提供应用下的资源。

步骤4:从上面的资源中获取主要类型为cq的子资源:ClientLibraryFolder

步骤5:从步骤4中的客户端libs资源获取类别并包含来自它们的JS

你实际上可以编写一个模型来调整组件资源到clientLibrary以实际清理代码。

如果您需要实际代码,请告诉我,我可以在空闲时间写下。