2016-07-26 61 views
1

我想要实现的是,如果我有2层组件的节点:负荷仅部分显示的脚本,在当前页面

  • COMPONENT1

    • clientlib
      • COMPONENT1 .js
  • COMPONENT2

    • clientlib
      • component2.js

,我拖曳到第1页,则产生第1页时,仅component1.js和COMPONENT2 .js将在导航到page1时加载。

一种方法,我看到是使用自定义Tag Library如下所述:http://www.icidigital.com/blog/best-approaches-clientlibs-aem-part-3/

我有两个问题:

1)是否有在AEM现有的功能来做到这一点?

2)如果不是,创建这样的自定义Tag Library最简单的方法是什么?

编辑:

假定有没有能力,只是包括所有组件clientLibs,而只加载那些添加到页面。

+0

这是开箱即用的AEM。这是[AEM 6.2的官方文档](https://docs.adobe.com/docs/en/aem/6-2/develop/the-basics/clientlibs.html),也适用于以前的版本。 – Abhishek

+0

它只描述了如何加载特定类别的脚本..我找不到如何加载当前页面中组件的脚本的引用,所以其他具有相同类别的组件的脚本不在该页面中已加载,ty – jony89

+0

应该使用与该组件相对应的唯一类别来定义组件特定的脚本。因此,当您跨页面使用相同的组件时,将包含这些脚本。如果您为多个组件的脚本提供了一个通用类别,那么它们应该在所有这些组件中提供一些通用功能。 – Abhishek

回答

0

理论上这样做的可能的方法是在你的页面组件/抽象的页面组件,做这样的事情来写剧本 -

第一步:字符串路径= currentPage.getPath()

第二步:查询此组件的路径(一种方法是让主列表在sling:resourceType上执行contains子句)

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

步骤4:从他们

从在步骤4中的客户机库资源得到的类别和包括JS:从上面的资源获取子资源与主类型为CQ:ClientLibraryFolder

步骤5

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

让我知道如果你需要实际的代码,我可以写在我的空闲时间。

1

没有内置的功能来做到这一点。虽然我听说客户端基础架构正在被重新编写,所以我对未来会添加类似的东西感到乐观。

我们有,而且我知道其他公司已经创建了一个“延迟脚本标记”。 Ours是一个非常简单的标记,它包含一个像clientlib include这样的HTML块,将它添加到一个唯一的列表中,然后在页脚的外部调用中,将其全部吐出。

下面是一个扩展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; 
}