2016-07-26 20 views
1

Was ich versuche zu erreichen ist, dass, wenn ich habe 2 Komponenten Knoten:Last nur Komponenten-Skripte, die in der aktuellen Seite sind

  • Komponente1

    • clientlib
      • Teil1 .js
  • Component2

    • clientlib
      • component2.js

und i ziehen, um sie in page1, dann, wenn page1 erzeugt wird, nur component1.js und Component2 .js wird beim Navigieren zu Seite1 geladen.

Ein Ansatz, den ich sah, ist Gewohnheit zu verwenden Tag Library wie hier beschrieben: http://www.icidigital.com/blog/best-approaches-clientlibs-aem-part-3/

Ich habe zwei Fragen:

1) gibt es eine bestehende Funktion in AEM dies zu tun?

2) Wenn nicht, was ist der einfachste Weg zum Erstellen solcher benutzerdefinierten Tag Library?

EDIT:

Angenommen, es gibt keine Möglichkeit, alle Komponenten clientLibs nur enthalten ist, sondern laden nur diejenigen, die auf der Seite hinzugefügt werden.

+0

Dies ist standardmäßig in AEM verfügbar. Hier ist die [offizielle Dokumentation für AEM 6.2] (https://docs.adobe.com/docs/en/aem/6-2/develop/the-basics/clientlibs.html) und gilt auch für frühere Versionen. – Abhishek

+0

Es wurde nur beschrieben, wie Skripte bestimmter Kategorien geladen werden. Ich kann keinen Verweis darauf finden, wie Skripte von Komponenten geladen werden, die sich auf der aktuellen Seite befinden. Andere Skripte von Komponenten derselben Kategorie, die nicht auf dieser Seite sind, werden nicht verwendet loaded, ty – jony89

+0

Komponentenspezifische Skripte sollten mit einer eindeutigen Kategorie definiert werden, die dieser Komponente entspricht. Wenn Sie dieselbe Komponente auf mehreren Seiten verwenden, sind diese Skripts enthalten. Wenn Sie den Skripten mehrerer Komponenten eine gemeinsame Kategorie zuweisen, sollten sie einige allgemeine Funktionen für alle Komponenten bereitstellen. – Abhishek

Antwort

0

theoretisch die Möglichkeit besteht darin, zu tun Skript auf Ihrer Seite Komponente/abstract Seite Komponente zu schreiben, die so etwas wie dies tut -

Schritt 1: String path = currentPage.getPath()

Schritt 2: Abfrage dieser Pfad für Komponenten (eine Möglichkeit besteht darin, eine contains-Klausel auf sling: resourceType zu haben)

Schritt 3: Ressourcenresolver für Benutzer, um den resourceType in Schritt 3 aufzulösen, damit erhalten Sie eine Ressource unter Ihren Apps.

Schritt 4: Aus der obigen Ressource die Unterressource mit primärem Typ als CQ erhalten: ClientLibraryFolder

Schritt 5: von der Client-Libs Ressource in Schritt 4 die Kategorien erhalten und umfassen die JS von ihnen

Sie könnten tatsächlich ein Modell schreiben, um eine Komponentenressource an eine clientLibrary anzupassen, um den Code tatsächlich zu bereinigen.

Lassen Sie mich wissen, wenn Sie tatsächlichen Code benötigen, kann ich das in meiner Freizeit schreiben.

1

Es gibt keine integrierte Funktion, um dies zu tun.Obwohl ich gehört habe, dass die clientlib-Infrastruktur nach einem Neuschreiben gesucht wird, bin ich optimistisch, dass so etwas in Zukunft hinzugefügt wird.

Wir haben, und ich weiß, dass andere Unternehmen haben, ein "zurückgestelltes Skript-Tag." Ours ist ein sehr einfaches Tag, das ein Stück HTML wie ein clientlib-Include aufnimmt, es zu einer eindeutigen Liste hinzufügt und dann bei einem Out-Call in der Fußzeile eins nach dem anderen ausspuckt.

Hier ist der Kern einer einfachen Tag-Implementierung, die BodyTagSupport erweitert. Dann in Ihrem Footer greifen Sie das Attribut und schreiben Sie es aus.

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; 
}