Lägga till navigering och routning navigation-routing
- Den universella redigeraren för visuell redigering av headless-innehåll.
- Innehållsfragmentredigeraren för formulärbaserad redigering av rubrikfritt innehåll.
Lär dig hur flera vyer i SPA stöds med AEM Pages och SPA Editor SDK. Dynamisk navigering implementeras med Angular-vägar och läggs till i en befintlig Header-komponent.
Syfte
- Förstå de alternativ för SPA-modellroutning som är tillgängliga när du använder SPA-redigeraren.
- Lär dig att använda Angular-routning för att navigera mellan olika vyer av SPA.
- Implementera en dynamisk navigering som styrs av AEM sidhierarki.
Vad du ska bygga
I det här kapitlet läggs en navigeringsmeny till i en befintlig Header-komponent. Navigeringsmenyn styrs av AEM sidhierarki och använder JSON-modellen som tillhandahålls av kärnkomponenten för navigering.
Förutsättningar
Granska de verktyg och instruktioner som krävs för att konfigurera en lokal utvecklingsmiljö.
Hämta koden
-
Hämta startpunkten för den här självstudiekursen via Git:
code language-shell $ git clone git@github.com:adobe/aem-guides-wknd-spa.git $ cd aem-guides-wknd-spa $ git checkout Angular/navigation-routing-start -
Distribuera kodbasen till en lokal AEM-instans med Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackageOm du använder AEM 6.x lägger du till profilen
classic:code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic -
Installera det färdiga paketet för den traditionella WKND-referensplatsen. Bilderna som tillhandahålls av WKND-referensplatsen återanvänds på WKND SPA. Paketet kan installeras med AEM Package Manager.
Du kan alltid visa den färdiga koden på GitHub eller checka ut koden lokalt genom att växla till grenen Angular/navigation-routing-solution.
Granska uppdateringar av HeaderComponent inspect-header
I tidigare kapitel lades komponenten HeaderComponent till som en ren Angular-komponent som inkluderades via app.component.html. I det här kapitlet tas komponenten HeaderComponent bort från programmet och läggs till via mallredigeraren. Detta gör att användare kan konfigurera navigeringsmenyn för HeaderComponent inifrån AEM.
-
I den IDE du väljer öppnar du SPA-startprojektet för det här kapitlet.
-
Under modulen
ui.frontendundersöker du filenheader.component.tsvid:ui.frontend/src/app/components/header/header.component.ts.Flera uppdateringar har gjorts, bland annat tillägg av en
HeaderEditConfigoch enMapTosom gör att komponenten kan mappas till en AEM-komponentwknd-spa-angular/components/header.code language-js /* header.component.ts */ ... const HeaderEditConfig = { ... }; @Component({ selector: 'app-header', templateUrl: './header.component.html', styleUrls: ['./header.component.scss'] }) export class HeaderComponent implements OnInit { @Input() items: object[]; ... } ... MapTo('wknd-spa-angular/components/header')(withRouter(Header), HeaderEditConfig);Observera
@Input()-anteckningen föritems.itemsinnehåller en array med navigeringsobjekt som skickas från AEM. -
Kontrollera komponentdefinitionen för AEM
Header-komponenten i modulenui.apps:ui.apps/src/main/content/jcr_root/apps/wknd-spa-angular/components/header/.content.xml:code language-xml <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" jcr:primaryType="cq:Component" jcr:title="Header" sling:resourceSuperType="wknd-spa-angular/components/navigation" componentGroup="WKND SPA Angular - Structure"/>AEM
Header-komponenten ärver alla funktioner i Navigation Core Component via egenskapensling:resourceSuperType.
Lägg till HeaderComponent i SPA-mallen add-header-template
-
Öppna en webbläsare och logga in på AEM, http://localhost:4502/. Startkodbasen ska redan distribueras.
-
Navigera till SPA Page Template: http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-page-template/structure.html.
-
Markera den yttre Root Layout Container och klicka på ikonen Policy för den. Var försiktig med att inte väljer Layout Container som inte är låst för redigering.
-
Kopiera den aktuella principen och skapa en ny princip med namnet SPA Structure:
Välj komponenten Layout Container under Allowed Components > General >.
Under Allowed Components > WKND SPA ANGULAR - STRUCTURE > väljer du komponenten Header:
Under Allowed Components > WKND SPA ANGULAR - Content > markerar du komponenterna Image och Text. Du bör välja totalt 4 komponenter.
Klicka på Done om du vill spara ändringarna.
-
Uppdatera sidan. Lägg till komponenten Header ovanför den olåsta Layout Container:
-
Markera komponenten Header och klicka på dess princip-ikon för att redigera profilen.
-
Skapa en ny princip med Policy Title av "WKND SPA Header".
Under Properties:
- Ange Navigation Root som
/content/wknd-spa-angular/us/en. - Ange Exclude Root Levels till 1.
- Avmarkera Collect al child pages.
- Ange Navigation Structure Depth till 3.
Detta samlar in navigering 2 nivåer under
/content/wknd-spa-angular/us/en. - Ange Navigation Root som
-
När du har sparat dina ändringar bör du se det ifyllda
Headersom en del av mallen:
Skapa underordnade sidor
Skapa sedan ytterligare sidor i AEM som ska fungera som de olika vyerna i SPA. Vi kommer också att undersöka den hierarkiska strukturen för JSON-modellen som tillhandahålls av AEM.
-
Gå till konsolen Platser: http://localhost:4502/sites.html/content/wknd-spa-angular/us/en/home. Markera WKND SPA Angular hemsida och klicka på Create > Page:
-
Under Template väljer du SPA Page. Under Properties anger du "Sida 1" som namn för Title och "sida-1".
Klicka på Create och öppna sidan i AEM SPA Editor genom att klicka på Open i dialogrutan.
-
Lägg till en ny Text-komponent i huvudkomponenten Layout Container. Redigera komponenten och ange texten: "Sida 1" med RTE- och elementet H1 (du måste ange helskärmsläge för att ändra styckeelementen)
Du kan lägga till ytterligare innehåll, som en bild.
-
Gå tillbaka till AEM Sites-konsolen och upprepa stegen ovan, och skapa en andra sida med namnet "Sida 2" som en jämställd sida med sidan 1. Lägg till innehåll på sidan 2 så att det är lätt att identifiera.
-
Skapa slutligen en tredje sida, "Sida 3", men som underordnad till sidan 2. När webbplatshierarkin är klar ska den se ut så här:
-
Öppna JSON-modell-API:t från AEM på en ny flik: http://localhost:4502/content/wknd-spa-angular/us/en.model.json. Det här JSON-innehållet begärs när SPA läses in för första gången. Den yttre strukturen ser ut så här:
code language-json { "language": "en", "title": "en", "templateName": "spa-app-template", "designPath": "/libs/settings/wcm/designs/default", "cssClassNames": "spa page basicpage", ":type": "wknd-spa-angular/components/spa", ":items": {}, ":itemsOrder": [], ":hierarchyType": "page", ":path": "/content/wknd-spa-angular/us/en", ":children": { "/content/wknd-spa-angular/us/en/home": {}, "/content/wknd-spa-angular/us/en/home/page-1": {}, "/content/wknd-spa-angular/us/en/home/page-2": {}, "/content/wknd-spa-angular/us/en/home/page-2/page-3": {} } }Under
:childrenska du se en post för varje sida som skapas. Innehållet för alla sidor finns i den här inledande JSON-begäran. När navigeringsflödet har implementerats läses efterföljande vyer av SPA in snabbt eftersom innehållet redan är tillgängligt på klientsidan.Det är inte klokt att läsa in ALL av innehållet i en SPA i den inledande JSON-begäran eftersom det skulle göra den inledande sidinläsningen långsammare. Nu ska vi titta på hur sidornas hierarkiska djup samlas in.
-
Gå till mallen SPA Root på: http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-app-template/structure.html.
Klicka på Page properties menu > Page Policy:
-
Mallen SPA Root har en extra Hierarchical Structure-flik som styr det JSON-innehåll som samlas in. Structure Depth avgör hur djupt i platshierarkin underordnade sidor ska samlas under roten. Du kan också använda fältet Structure Patterns för att filtrera bort ytterligare sidor baserat på ett reguljärt uttryck.
Uppdatera Structure Depth till "2":
Klicka på Done om du vill spara ändringarna i profilen.
-
Öppna JSON-modellen http://localhost:4502/content/wknd-spa-angular/us/en.model.json igen.
code language-json { "language": "en", "title": "en", "templateName": "spa-app-template", "designPath": "/libs/settings/wcm/designs/default", "cssClassNames": "spa page basicpage", ":type": "wknd-spa-angular/components/spa", ":items": {}, ":itemsOrder": [], ":hierarchyType": "page", ":path": "/content/wknd-spa-angular/us/en", ":children": { "/content/wknd-spa-angular/us/en/home": {}, "/content/wknd-spa-angular/us/en/home/page-1": {}, "/content/wknd-spa-angular/us/en/home/page-2": {} } }Observera att sökvägen Sidan 3 har tagits bort:
/content/wknd-spa-angular/us/en/home/page-2/page-3från den ursprungliga JSON-modellen.Senare kommer vi att se hur AEM SPA Editor SDK dynamiskt kan läsa in ytterligare innehåll.
Implementera navigeringen
Implementera sedan navigeringsmenyn med en ny NavigationComponent. Vi kan lägga till koden direkt i header.component.html, men det är bättre att undvika stora komponenter. Implementera i stället en NavigationComponent som kan återanvändas senare.
-
Granska den JSON som exponeras av AEM
Header-komponenten på http://localhost:4502/content/wknd-spa-angular/us/en.model.json:code language-json ... "header": { "items": [ { "level": 0, "active": true, "path": "/content/wknd-spa-angular/us/en/home", "description": null, "url": "/content/wknd-spa-angular/us/en/home.html", "lastModified": 1589062597083, "title": "WKND SPA Angular Home Page", "children": [ { "children": [], "level": 1, "active": false, "path": "/content/wknd-spa-angular/us/en/home/page-1", "description": null, "url": "/content/wknd-spa-angular/us/en/home/page-1.html", "lastModified": 1589429385100, "title": "Page 1" }, { "level": 1, "active": true, "path": "/content/wknd-spa-angular/us/en/home/page-2", "description": null, "url": "/content/wknd-spa-angular/us/en/home/page-2.html", "lastModified": 1589429603507, "title": "Page 2", "children": [ { "children": [], "level": 2, "active": false, "path": "/content/wknd-spa-angular/us/en/home/page-2/page-3", "description": null, "url": "/content/wknd-spa-angular/us/en/home/page-2/page-3.html", "lastModified": 1589430413831, "title": "Page 3" } ], } ] } ], ":type": "wknd-spa-angular/components/header"AEM-sidornas hierarkiska karaktär modelleras i JSON som kan användas för att fylla i en navigeringsmeny. Kom ihåg att komponenten
Headerärver alla funktioner i Navigation Core Component och att innehållet som visas via JSON automatiskt mappas till Angular@Input-anteckningen. -
Öppna ett nytt terminalfönster och navigera till mappen
ui.frontendi SPA-projektet. Skapa en nyNavigationComponentmed Angular CLI-verktyget:code language-shell $ cd ui.frontend $ ng generate component components/navigation CREATE src/app/components/navigation/navigation.component.scss (0 bytes) CREATE src/app/components/navigation/navigation.component.html (25 bytes) CREATE src/app/components/navigation/navigation.component.spec.ts (656 bytes) CREATE src/app/components/navigation/navigation.component.ts (286 bytes) UPDATE src/app/app.module.ts (2032 bytes) -
Skapa sedan en klass med namnet
NavigationLinkmed Angular CLI i den nyligen skapade katalogencomponents/navigation:code language-shell $ cd src/app/components/navigation/ $ ng generate class NavigationLink CREATE src/app/components/navigation/navigation-link.spec.ts (187 bytes) CREATE src/app/components/navigation/navigation-link.ts (32 bytes) -
Gå tillbaka till den utvecklingsmiljö du valt och öppna filen
navigation-link.tskl./src/app/components/navigation/navigation-link.ts.
-
Fyll i
navigation-link.tsmed följande:code language-js export class NavigationLink { title: string; path: string; url: string; level: number; children: NavigationLink[]; active: boolean; constructor(data) { this.path = data.path; this.title = data.title; this.url = data.url; this.level = data.level; this.active = data.active; this.children = data.children.map( item => { return new NavigationLink(item); }); } }Det här är en enkel klass som representerar en enskild navigeringslänk. I klasskonstruktorn förväntar vi att
dataska vara det JSON-objekt som skickas från AEM. Den här klassen används både iNavigationComponentochHeaderComponentför att enkelt fylla i navigeringsstrukturen.Ingen dataomvandling utförs, den här klassen skapas främst för att skriva JSON-modellen med hög kvalitet. Observera att
this.childrenhar typenNavigationLink[]och att konstruktorn skapar nyaNavigationLink-objekt rekursivt för vart och ett av objekten i arrayenchildren. Kom ihåg att JSON-modellen förHeaderär hierarkisk. -
Öppna filen
navigation-link.spec.ts. Det här är testfilen för klassenNavigationLink. Uppdatera den med följande:code language-js import { NavigationLink } from './navigation-link'; describe('NavigationLink', () => { it('should create an instance', () => { const data = { children: [], level: 1, active: false, path: '/content/wknd-spa-angular/us/en/home/page-1', description: null, url: '/content/wknd-spa-angular/us/en/home/page-1.html', lastModified: 1589429385100, title: 'Page 1' }; expect(new NavigationLink(data)).toBeTruthy(); }); });Observera att
const dataföljer samma JSON-modell som tidigare inspekterats för en enda länk. Detta är långt ifrån ett robust enhetstest, men det bör räcka att testa konstruktorn förNavigationLink. -
Öppna filen
navigation.component.ts. Uppdatera den med följande:code language-js import { Component, OnInit, Input } from '@angular/core'; import { NavigationLink } from './navigation-link'; @Component({ selector: 'app-navigation', templateUrl: './navigation.component.html', styleUrls: ['./navigation.component.scss'] }) export class NavigationComponent implements OnInit { @Input() items: object[]; constructor() { } get navigationLinks(): NavigationLink[] { if (this.items && this.items.length > 0) { return this.items.map(item => { return new NavigationLink(item); }); } return null; } ngOnInit() {} }NavigationComponentförväntar sig enobject[]med namnetitemssom är JSON-modellen från AEM. Den här klassen visar en enskild metod,get navigationLinks(), som returnerar en array medNavigationLinkobjekt. -
Öppna filen
navigation.component.htmloch uppdatera den med följande:code language-html <ul *ngIf="navigationLinks && navigationLinks.length > 0" class="navigation__group"> <ng-container *ngTemplateOutlet="recursiveListTmpl; context:{ links: navigationLinks }"></ng-container> </ul>Detta genererar en inledande
<ul>och anropar metodenget navigationLinks()frånnavigation.component.ts. En<ng-container>används för att göra ett anrop till en mall med namnetrecursiveListTmploch skickar den tillnavigationLinkssom en variabel med namnetlinks.Lägg till nästa
recursiveListTmpl:code language-html <ng-template #recursiveListTmpl let-links="links"> <li *ngFor="let link of links" class="{{'navigation__item navigation__item--' + link.level}}"> <a [routerLink]="link.url" class="navigation__item-link" [title]="link.title" [attr.aria-current]="link.active"> {{link.title}} </a> <ul *ngIf="link.children && link.children.length > 0"> <ng-container *ngTemplateOutlet="recursiveListTmpl; context:{ links: link.children }"></ng-container> </ul> </li> </ng-template>Här implementeras resten av återgivningen för navigeringslänken. Observera att variabeln
linkär av typenNavigationLinkoch att alla metoder och egenskaper som skapats av den klassen är tillgängliga.[routerLink]används i stället för normalthref-attribut. Det gör att vi kan länka till specifika vägar i appen utan att behöva uppdatera hela sidan.Den rekursiva delen av navigeringen implementeras också genom att en annan
<ul>skapas om den aktuellalinkhar en icke-tomchildren-matris. -
Uppdatera
navigation.component.spec.tsom du vill lägga till stöd förRouterTestingModule:code language-diff ... + import { RouterTestingModule } from '@angular/router/testing'; ... beforeEach(async(() => { TestBed.configureTestingModule({ + imports: [ RouterTestingModule ], declarations: [ NavigationComponent ] }) .compileComponents(); })); ...Det krävs att
RouterTestingModuleläggs till eftersom komponenten använder[routerLink]. -
Uppdatera
navigation.component.scssom du vill lägga till några grundläggande format iNavigationComponent:
@import "~src/styles/variables";
$link-color: $black;
$link-hover-color: $white;
$link-background: $black;
:host-context {
display: block;
width: 100%;
}
.navigation__item {
list-style: none;
}
.navigation__item-link {
color: $link-color;
font-size: $font-size-large;
text-transform: uppercase;
padding: $gutter-padding;
display: flex;
border-bottom: 1px solid $gray;
&:hover {
background: $link-background;
color: $link-hover-color;
}
}
Uppdatera huvudkomponenten
Nu när NavigationComponent har implementerats måste HeaderComponent uppdateras för att referera till den.
-
Öppna en terminal och navigera till mappen
ui.frontendi SPA-projektet. Starta webbpaketets dev-server:code language-shell $ npm start -
Öppna en webbläsarflik och gå till http://localhost:4200/.
Webbpaketets dev-server ska konfigureras att proxyansluta JSON-modellen från en lokal instans av AEM (
ui.frontend/proxy.conf.json). På så sätt kan vi koda direkt mot innehåll som skapats i AEM tidigare i kursen.
Menyalternativfunktionen är redan implementerad i
HeaderComponent. Lägg sedan till navigeringskomponenten. -
Gå tillbaka till den utvecklingsmiljö du vill använda och öppna filen
header.component.tspåui.frontend/src/app/components/header/header.component.ts. -
Uppdatera metoden
setHomePage()om du vill ta bort den hårdkodade strängen och använda de dynamiska uttryck som skickas av AEM-komponenten:code language-js /* header.component.ts */ import { NavigationLink } from '../navigation/navigation-link'; ... setHomePage() { if (this.hasNavigation) { const rootNavigationLink: NavigationLink = new NavigationLink(this.items[0]); this.isHome = rootNavigationLink.path === this.route.snapshot.data.path; this.homePageUrl = rootNavigationLink.url; } } ...En ny instans av
NavigationLinkskapas baserat påitems[0], roten för den JSON-navigeringsmodell som skickas från AEM.this.route.snapshot.data.pathreturnerar sökvägen för den aktuella Angular-vägen. Det här värdet används för att avgöra om den aktuella vägen är startsidan.this.homePageUrlanvänds för att fylla i ankarlänken på logotypen. -
Öppna
header.component.htmloch ersätt den statiska platshållaren för navigeringen med en referens till den nyaNavigationComponent:code language-diff <div class="header-navigation"> <div class="navigation"> - Navigation Placeholder + <app-navigation [items]="items"></app-navigation> </div> </div>[items]=items-attributet skickar@Input() itemsfrånHeaderComponenttillNavigationComponentdär navigeringen ska skapas. -
Öppna
header.component.spec.tsoch lägg till en deklaration förNavigationComponent:code language-diff /* header.component.spect.ts */ + import { NavigationComponent } from '../navigation/navigation.component'; describe('HeaderComponent', () => { let component: HeaderComponent; let fixture: ComponentFixture<HeaderComponent>; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ RouterTestingModule ], + declarations: [ HeaderComponent, NavigationComponent ] }) .compileComponents(); }));Eftersom
NavigationComponentnu används som en del avHeaderComponentmåste den deklareras som en del av testbädden. -
Spara ändringar i alla öppna filer och gå tillbaka till webbpaketets dev-server: http://localhost:4200/
Öppna navigeringen genom att klicka på menyväxlingsknappen så visas de ifyllda navigeringslänkarna. Du bör kunna navigera till olika vyer av SPA.
Förstå SPA-routning
Nu när navigeringen har implementerats inspekterar du routningen i AEM.
-
I IDE öppnar du filen
app-routing.module.tsvidui.frontend/src/app.code language-js /* app-routing.module.ts */ import { AemPageDataResolver, AemPageRouteReuseStrategy } from '@adobe/cq-angular-editable-components'; import { NgModule } from '@angular/core'; import { RouteReuseStrategy, RouterModule, Routes, UrlMatchResult, UrlSegment } from '@angular/router'; import { PageComponent } from './components/page/page.component'; export function AemPageMatcher(url: UrlSegment[]): UrlMatchResult { if (url.length) { return { consumed: url, posParams: { path: url[url.length - 1] } }; } } const routes: Routes = [ { matcher: AemPageMatcher, component: PageComponent, resolve: { path: AemPageDataResolver } } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule], providers: [ AemPageDataResolver, { provide: RouteReuseStrategy, useClass: AemPageRouteReuseStrategy } ] }) export class AppRoutingModule {}Arrayen
routes: Routes = [];definierar vägar eller navigeringssökvägar till Angular-komponentmappningar.AemPageMatcherär en anpassad Angular-router, UrlMatcher, som matchar allt som "ser ut som" en sida i AEM som är en del av det här Angular-programmet.PageComponentär den Angular-komponent som representerar en sida i AEM och som används för att återge de matchande vägarna.PageComponentgranskas senare i självstudien.AemPageDataResolver, som tillhandahålls av AEM SPA Editor JS SDK, är en anpassad Angular Router Resolver som används för att omforma väg-URL:en, som är sökvägen i AEM inklusive tillägget .html, till resurssökvägen i AEM, som är sidsökvägen minus tillägget.AemPageDataResolveromformar till exempel en vägs URLcontent/wknd-spa-angular/us/en/home.htmltill sökvägen/content/wknd-spa-angular/us/en/home. Detta används för att matcha sidans innehåll baserat på sökvägen i JSON-modellens API.AemPageRouteReuseStrategy, som tillhandahålls av AEM SPA Editor JS SDK, är en anpassad RouteReuseStrategy som förhindrar återanvändning avPageComponentöver vägar. Annars kan innehåll från sidan "A" visas vid navigering till sidan "B". -
Öppna filen
page.component.tsvidui.frontend/src/app/components/page/.code language-js ... export class PageComponent { items; itemsOrder; path; constructor( private route: ActivatedRoute, private modelManagerService: ModelManagerService ) { this.modelManagerService .getData({ path: this.route.snapshot.data.path }) .then(data => { this.path = data[Constants.PATH_PROP]; this.items = data[Constants.ITEMS_PROP]; this.itemsOrder = data[Constants.ITEMS_ORDER_PROP]; }); } }PageComponentkrävs för att bearbeta den JSON som har hämtats från AEM och används som Angular-komponent för att återge vägarna.ActivatedRoute, som tillhandahålls av modulen Angular Router, innehåller läget som anger vilket JSON-innehåll för AEM Page som ska läsas in i den här instansen av Angular Page-komponenten.ModelManagerServicehämtar JSON-data baserat på vägen och mappar data till klassvariablernapath,items,itemsOrder. Dessa skickas sedan till AEMPageComponent -
Öppna filen
page.component.htmlvidui.frontend/src/app/components/page/code language-html <aem-page class="structure-page" [attr.data-cq-page-path]="path" [cqPath]="path" [cqItems]="items" [cqItemsOrder]="itemsOrder"> </aem-page>aem-pageinnehåller AEMPageComponent. Variablernapath,itemsochitemsOrderskickas tillAEMPageComponent.AemPageComponentsom tillhandahålls via SPA-redigeraren JavaScript SDK itererar sedan över dessa data och instansierar dynamiskt Angular-komponenter baserat på JSON-data som visas i självstudiekursen Kartkomponenter.PageComponentär egentligen bara en proxy förAEMPageComponentoch det ärAEMPageComponentsom gör större delen av det tunga lyftet för att korrekt mappa JSON-modellen till Angular-komponenterna.
Inspektera SPA-routningen i AEM
-
Öppna en terminal och stoppa webbpaketets dev-server om den startas. Navigera till projektets rot och distribuera projektet till AEM med dina Maven-kunskaper:
code language-shell $ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackagenote caution CAUTION Vissa mycket strikta lintingregler är aktiverade i Angular-projektet. Om det inte går att skapa Maven kontrollerar du felet och söker efter Lint-fel i de listade filerna.. Åtgärda eventuella fel som uppstått vid markören och kör kommandot Maven igen. -
Gå till SPA-startsidan i AEM: http://localhost:4502/content/wknd-spa-angular/us/en/home.html och öppna webbläsarens utvecklingsverktyg. Skärmbilder nedan hämtas från Google Chrome webbläsare.
Uppdatera sidan så ser du en XHR-begäran till
/content/wknd-spa-angular/us/en.model.json, som är SPA-roten. Observera att endast tre underordnade sidor inkluderas baserat på hierarkidjupets konfiguration till SPA-rotmallen som skapades tidigare i självstudiekursen. Detta inkluderar inte sidan 3.
-
Gå till sidan 3 när utvecklingsverktygen är öppna:
Observera att en ny XHR-begäran görs till:
/content/wknd-spa-angular/us/en/home/page-2/page-3.model.json
AEM Model Manager förstår att JSON-innehållet Sidan 3 inte är tillgängligt och utlöser automatiskt den ytterligare XHR-begäran.
-
Fortsätt navigera i SPA med de olika navigeringslänkarna. Observera att inga ytterligare XHR-begäranden görs och att inga fullständiga siduppdateringar görs. Detta gör att SPA-avtalet blir snabbt för slutanvändaren och minskar onödiga förfrågningar till AEM.
-
Experimentera med djupa länkar genom att navigera direkt till: http://localhost:4502/content/wknd-spa-angular/us/en/home/page-2.html. Observera att webbläsarens bakåtknapp fortsätter att fungera.
Grattis! congratulations
Grattis! Du har lärt dig hur flera vyer i SPA kan användas genom att mappa till AEM Pages med SPA Editor SDK. Dynamisk navigering har implementerats med Angular-routning och lagts till i komponenten Header.
Du kan alltid visa den färdiga koden på GitHub eller checka ut koden lokalt genom att växla till grenen Angular/navigation-routing-solution.
Nästa steg next-steps
Skapa en anpassad komponent - Lär dig hur du skapar en anpassad komponent som ska användas med AEM SPA Editor. Lär dig hur du utvecklar redigeringsdialogrutor och Sling-modeller för att utöka JSON-modellen så att den fyller i en anpassad komponent.