我想要实现的是,如果我有2个组件节点:
component1
component2
然后我将它们拖到page1中,然后当生成page1时,导航到page1时将只加载component1.js和component2.js。
我看到的一种方法是使用此处所述的自定义Tag Library
:http://www.icidigital.com/blog/best-approaches-clientlibs-aem-part-3/
我有两个问题:
1)AEM中是否有现成功能?
2)如果没有,创建此类自定义Tag Library
的最简单方法是什么?
编辑:
假设没有能力只包含所有组件clientLib,而只加载那些添加到页面中的组件。
答案 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以实际清理代码。
如果您需要实际代码,请告诉我,我可以在空闲时间写下。