Aem 仅加载当前页面中的组件脚本
我试图实现的是,如果我有两个组件节点:Aem 仅加载当前页面中的组件脚本,aem,Aem,我试图实现的是,如果我有两个组件节点: 组件1 客户端库 组件1.js 组件2 客户端库 组件2.js 我将它们拖到page1中,然后在生成page1时,导航到page1时只加载component1.js和component2.js 我看到的一种方法是使用自定义标记库,如下所述: 我有两个问题: 1) AEM中是否存在执行此操作的现有功能 2) 如果没有,创建此类自定义标记库的最简单方法是什么 编辑: 假设不能只包含所有组件ClientLib,而只能加载添加到页面中的组件。理
- 组件1
- 客户端库
- 组件1.js
- 客户端库
- 组件2
- 客户端库
- 组件2.js
- 客户端库
标记库
,如下所述:
我有两个问题:
1) AEM中是否存在执行此操作的现有功能
2) 如果没有,创建此类自定义标记库的最简单方法是什么
编辑:
假设不能只包含所有组件ClientLib,而只能加载添加到页面中的组件。理论上,可能的方法是在页面组件/抽象页面组件中编写脚本,这样做- 步骤1:字符串路径=currentPage.getPath() 步骤2:查询组件的此路径(一种方法是让主列表在sling:resourceType上执行contains子句) 步骤3:用户资源解析程序在步骤3中解析资源类型,这将为您的应用程序下提供资源 步骤4:从上述资源中获取主要类型为cq:ClientLibraryFolder的子资源 第5步:从第4步中的客户机libs资源中获取类别并包含其中的JS 实际上,您可以编写一个模型,使组件资源适应clientLibrary,从而实际清理代码
如果您需要实际的代码,请告诉我,我可以在空闲时间编写。没有内置的功能来完成此操作。虽然我听说clientlib基础设施正在考虑重新编写,但我对将来添加类似的内容持乐观态度 我们已经,我知道其他公司已经创建了一个“延迟脚本标记”。我们的标记非常简单,可以像clientlib include一样获取一大块html,将其添加到一个唯一的列表中,然后在页脚发出一个out call,一个接一个地吐出所有内容 下面是扩展BodyTag支持的简单标记实现的核心。然后在页脚中抓住属性并写出它
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;
}
public int doEndTag()抛出JspException{
SlingHttpServletRequest=(SlingHttpServletRequest)pageContext.getAttribute(“slingRequest”);
Set delayed=(Set)request.getAttribute(delayed_INCLUDE);
如果(延迟==null){
延迟=新的HashSet();
}
if(StringUtils.isNotBlank(this.bodyContent.getString())){
delayed.add(this.bodyContent.getString().trim());
}
request.setAttribute(DELAYED_INCLUDE,DELAYED);
返回评估页面;
}
这在AEM中是现成的。以下是,也适用于以前的版本。它仅描述了如何加载特定类别的脚本。。我找不到如何加载当前页面中的组件脚本的参考,因此不会加载不在该页面中的具有相同类别的组件的其他脚本,tyComponent特定脚本应使用该组件对应的唯一类别定义。因此,当您跨页面使用相同的组件时,这些脚本将被包括在内。如果您为多个组件的脚本提供一个公共类别,那么它们应该在所有这些组件中提供一些公共功能。