Agregar navegación y enrutamiento navigation-routing
SPA AEM SPA Descubra cómo se admiten varias vistas en la mediante páginas de la página de la aplicación y el SDK del Editor de la página de la aplicación de la aplicación de la aplicación de la. La navegación dinámica se implementa mediante rutas de Angular y se añade a un componente de encabezado existente.
Objetivo
- SPA SPA Comprender las opciones de enrutamiento del modelo de disponibles al utilizar el Editor de rutas.
- Aprenda a utilizar enrutamiento de Angular SPA para desplazarse entre las distintas vistas de la.
- AEM Implemente una navegación dinámica impulsada por la jerarquía de páginas de la página de la.
Qué va a generar
Este capítulo agrega un menú de navegación a un componente Header
existente. AEM El menú de navegación está gobernado por la jerarquía de páginas de y usa el modelo JSON proporcionado por el componente principal de navegación.
Requisitos previos
Revise las herramientas y las instrucciones necesarias para configurar un entorno de desarrollo local.
Obtener el código
-
Descargue el punto de partida para este tutorial mediante 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
-
AEM Implemente el código base en una instancia de local mediante Maven:
code language-shell $ mvn clean install -PautoInstallSinglePackage
AEM Si usa 6.x, agregue el perfil
classic
:code language-shell $ mvn clean install -PautoInstallSinglePackage -Pclassic
-
Instale el paquete terminado para el sitio de referencia WKND tradicional. SPA Las imágenes proporcionadas por el sitio de referencia WKND se reutilizarán en el sitio WKND de forma que se puedan ver en la interfaz de usuario de WKND. AEM El paquete se puede instalar usando el Administrador de paquetes de.
Siempre puede ver el código terminado en GitHub o desprotegerlo localmente cambiando a la rama Angular/navigation-routing-solution
.
Actualizaciones de componentes de encabezado de Inspect inspect-header
En capítulos anteriores, el componente HeaderComponent
se agregó como un componente de Angular puro incluido mediante app.component.html
. En este capítulo, el componente HeaderComponent
se quita de la aplicación y se agrega mediante el Editor de plantillas. AEM Esto permite a los usuarios configurar el menú de navegación de HeaderComponent
desde el interior de la.
-
SPA En el IDE de su elección, abra el proyecto de inicio de la para este capítulo.
-
Debajo del módulo
ui.frontend
, inspeccione el archivoheader.component.ts
en:ui.frontend/src/app/components/header/header.component.ts
.AEM Se han realizado varias actualizaciones, incluida la adición de un
HeaderEditConfig
y unMapTo
para permitir que el componente se asigne a un componente de lawknd-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);
Observe la anotación
@Input()
paraitems
. AEMitems
contendrá una matriz de objetos de navegación pasados desde el punto de vista de la vista de la vista de la vista de la. -
AEM En el módulo
ui.apps
, inspeccione la definición del componente del componenteHeader
de la: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 El componente
Header
de la heredará toda la funcionalidad del componente principal de navegación a través de la propiedadsling:resourceSuperType
.
SPA Agregue el componente HeaderComponent a la plantilla de la add-header-template
-
AEM Abra un explorador e inicie sesión en el sitio de inicio de sesión, http://localhost:4502/. La base del código de inicio ya debería implementarse.
-
SPA Vaya a la Plantilla de página de: http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-page-template/structure.html.
-
Seleccione el contenedor de diseño raíz más externo y haga clic en su icono directiva. Tenga cuidado no al seleccionar el contenedor de diseño desbloqueado para la creación.
-
SPA Copie la directiva actual y cree una directiva nueva con el nombre Estructura de la:
SPA
En Componentes permitidos > General > seleccione el componente Contenedor de diseño.
SPA En Componentes permitidos > ANGULAR de trabajo de WKND - ESTRUCTURA > seleccione el componente Encabezado:
SPA En Componentes permitidos > ANGULAR de trabajo de WKND-- Contenido > seleccione los componentes Imagen y Texto. Debe tener un total de 4 componentes seleccionados.
Haga clic en Listo para guardar los cambios.
-
Actualizar la página. Agregue el componente Header sobre el Contenedor de diseño desbloqueado:
-
Seleccione el componente Header y haga clic en su icono Policy para editar la directiva.
-
SPA Cree una nueva directiva con un Título de directiva de "Encabezado de WKND de la".
En Propiedades:
- Establezca Raíz de navegación en
/content/wknd-spa-angular/us/en
. - Establecer Excluir niveles de raíz en 1.
- Desmarque Recopilar todas las páginas secundarias.
- Establezca la profundidad de la estructura de navegación en 3.
Se recopilará la navegación 2 niveles por debajo de
/content/wknd-spa-angular/us/en
. - Establezca Raíz de navegación en
-
Después de guardar los cambios, debería ver los
Header
rellenados como parte de la plantilla:
Creación de páginas secundarias
AEM SPA A continuación, cree páginas adicionales en las que se puedan usar las vistas diferentes de las vistas de la. AEM También inspeccionaremos la estructura jerárquica del modelo JSON proporcionado por los usuarios de la plataforma de datos de la plataforma de datos de.
-
Vaya a la consola de Sites: http://localhost:4502/sites.html/content/wknd-spa-angular/us/en/home. SPA Seleccione la página principal del Angular de trabajo de WKND y haga clic en Crear > Página:
-
SPA En Plantilla, seleccione Página de. En Propiedades, escriba "Página 1" para Título y "Página-1" como nombre.
AEM SPA Haga clic en Crear y, en el cuadro de diálogo emergente, haga clic en Abrir para abrir la página en el Editor de.
-
Agregue un nuevo componente Text al contenedor de diseño principal. Edite el componente e introduzca el texto: "Página 1" con el RTE y el elemento H1 (tendrá que ingresar al modo de pantalla completa para cambiar los elementos del párrafo)
No dude en añadir contenido adicional, como una imagen.
-
Vuelva a la consola de AEM Sites y repita los pasos anteriores, creando una segunda página denominada "Página 2" como elemento secundario de Página 1. Agregue contenido a Página 2 para que se pueda identificar fácilmente.
-
Por último, cree una tercera página, "Página 3", pero como elemento secundario de Página 2. Una vez completada, la jerarquía del sitio debe tener el siguiente aspecto:
-
AEM En una pestaña nueva, abra la API del modelo JSON proporcionada por el usuario: http://localhost:4502/content/wknd-spa-angular/us/en.model.json. SPA Este contenido JSON se solicita cuando se carga la por primera vez. La estructura exterior tiene el siguiente aspecto:
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": {} } }
En
:children
debería ver una entrada para cada una de las páginas creadas. El contenido de todas las páginas se encuentra en esta solicitud JSON inicial. SPA Una vez implementado el enrutamiento de navegación, las vistas subsiguientes de la se cargan rápidamente, ya que el contenido ya está disponible en el lado del cliente.SPA No es aconsejable cargar ALL del contenido de un elemento en la solicitud inicial de JSON, ya que esto ralentizaría la carga inicial de la página. A continuación, veamos cómo se recopila la profundidad de jerarquía de las páginas.
-
SPA Vaya a la plantilla Raíz de en: http://localhost:4502/editor.html/conf/wknd-spa-angular/settings/wcm/templates/spa-app-template/structure.html.
Haga clic en el menú Propiedades de página > Directiva de página:
SPA
-
SPA La plantilla Raíz de tiene una ficha Estructura jerárquica adicional para controlar el contenido JSON recopilado. La profundidad de la estructura determina la profundidad en la jerarquía del sitio para recopilar páginas secundarias debajo de la raíz. También puede usar el campo Patrones de estructura para filtrar páginas adicionales en función de una expresión regular.
Actualizar la profundidad de la estructura a "2":
Haga clic en Listo para guardar los cambios en la directiva.
-
Vuelva a abrir el modelo JSON http://localhost:4502/content/wknd-spa-angular/us/en.model.json.
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": {} } }
Observe que la ruta de acceso Página 3 se ha eliminado:
/content/wknd-spa-angular/us/en/home/page-2/page-3
del modelo JSON inicial.AEM SPA Más adelante, observaremos cómo el SDK del Editor de código de tiempo de ejecución (SDK) de la de contenido puede cargar dinámicamente contenido adicional.
Implementación de la navegación
A continuación, implemente el menú de navegación con un nuevo NavigationComponent
. Podríamos agregar el código directamente en header.component.html
, pero se recomienda evitar componentes grandes. En su lugar, implemente un NavigationComponent
que podría reutilizarse más adelante.
-
AEM Revise el JSON expuesto por el componente
Header
de la en 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 La naturaleza jerárquica de las páginas de la se modela en el archivo JSON, que se puede utilizar para rellenar un menú de navegación. Recuerde que el componente
Header
hereda toda la funcionalidad del componente principal de navegación y que el contenido expuesto a través del JSON se asigna automáticamente a la anotación de Angular@Input
. -
SPA Abra una nueva ventana de terminal y navegue hasta la carpeta
ui.frontend
del proyecto de. Crear un(a) nuevo(a)NavigationComponent
mediante la herramienta CLI de Angular: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)
-
A continuación, cree una clase denominada
NavigationLink
utilizando la CLI de Angular en el directoriocomponents/navigation
recién creado: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)
-
Vuelva al IDE de su elección y abra el archivo en
navigation-link.ts
a las/src/app/components/navigation/navigation-link.ts
. -
Rellene
navigation-link.ts
con lo siguiente: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); }); } }
Se trata de una clase simple que representa un vínculo de navegación individual. AEM En el constructor de clase se espera que
data
sea el objeto JSON pasado desde el punto de vista de la. Esta clase se usa tanto enNavigationComponent
como enHeaderComponent
para rellenar fácilmente la estructura de exploración.No se realiza ninguna transformación de datos, esta clase se crea principalmente para escribir de forma segura el modelo JSON. Observe que
this.children
tiene el tipoNavigationLink[]
y que el constructor crea recursivamente nuevos objetosNavigationLink
para cada uno de los elementos de la matrizchildren
. Recuerde que el modelo JSON paraHeader
es jerárquico. -
Abra el archivo
navigation-link.spec.ts
. Este es el archivo de prueba para la claseNavigationLink
. Actualícelo con lo siguiente: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(); }); });
Observe que
const data
sigue el mismo modelo JSON inspeccionado anteriormente para un solo vínculo. No se trata de una prueba unitaria sólida; sin embargo, debería bastar con probar el constructor deNavigationLink
. -
Abra el archivo
navigation.component.ts
. Actualícelo con lo siguiente: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() {} }
AEM
NavigationComponent
espera un(a)object[]
denominadoitems
que es el modelo JSON de la base de datos de la interfaz de usuario de. Esta clase expone un único métodoget navigationLinks()
que devuelve una matriz deNavigationLink
objetos. -
Abra el archivo
navigation.component.html
y actualícelo con lo siguiente:code language-html <ul *ngIf="navigationLinks && navigationLinks.length > 0" class="navigation__group"> <ng-container *ngTemplateOutlet="recursiveListTmpl; context:{ links: navigationLinks }"></ng-container> </ul>
Esto genera un
<ul>
inicial y llama al métodoget navigationLinks()
desdenavigation.component.ts
. Se utiliza un<ng-container>
para realizar una llamada a una plantilla denominadarecursiveListTmpl
y se pasa elnavigationLinks
como una variable denominadalinks
.Agregar
recursiveListTmpl
siguiente: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>
Aquí se implementa el resto de la renderización del vínculo de navegación. Tenga en cuenta que la variable
link
es del tipoNavigationLink
y que todos los métodos/propiedades creados por esa clase están disponibles.[routerLink]
se usa en lugar del atributohref
normal. Esto nos permite vincular a rutas específicas en la aplicación, sin una actualización de página completa.La parte recursiva de la navegación también se implementa creando otro
<ul>
si el objetolink
actual tiene una matrizchildren
que no esté vacía. -
Actualizar
navigation.component.spec.ts
para agregar compatibilidad conRouterTestingModule
:code language-diff ... + import { RouterTestingModule } from '@angular/router/testing'; ... beforeEach(async(() => { TestBed.configureTestingModule({ + imports: [ RouterTestingModule ], declarations: [ NavigationComponent ] }) .compileComponents(); })); ...
Se requiere agregar
RouterTestingModule
porque el componente usa[routerLink]
. -
Actualice
navigation.component.scss
para agregar algunos estilos básicos aNavigationComponent
:
@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;
}
}
Actualización del componente del encabezado
Ahora que NavigationComponent
se ha implementado, HeaderComponent
debe actualizarse para hacer referencia a él.
-
SPA Abra un terminal y vaya a la carpeta
ui.frontend
dentro del proyecto de. Inicie el servidor de desarrollo de Webpack:code language-shell $ npm start
-
Abra una ficha del explorador y vaya a http://localhost:4200/.
AEM El servidor de desarrollo de Webpack debe configurarse para representar el modelo JSON desde una instancia local de (
ui.frontend/proxy.conf.json
). AEM Esto nos permite codificar directamente en el contenido creado en la aplicación desde el que se ha creado la aplicación de forma predeterminada en el tutorial anterior.HeaderComponent
tiene implementada actualmente la funcionalidad de alternancia de menús. A continuación, añada el componente de navegación. -
Vuelva al IDE que desee y abra el archivo
header.component.ts
enui.frontend/src/app/components/header/header.component.ts
. -
AEM Actualice el método
setHomePage()
para quitar el valor String codificado de forma rígida y utilice las props dinámicas pasadas por el componente de la: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; } } ...
AEM Se crea una nueva instancia de
NavigationLink
basada enitems[0]
, la raíz del modelo JSON de navegación pasado desde el servidor de correo de.this.route.snapshot.data.path
devuelve la ruta de la ruta de Angular actual. Este valor se usa para determinar si la ruta actual es la página principal.this.homePageUrl
se usa para rellenar el vínculo de anclaje en el logotipo. -
Abra
header.component.html
y reemplace el marcador de posición estático para la navegación con una referencia alNavigationComponent
recién creado:code language-diff <div class="header-navigation"> <div class="navigation"> - Navigation Placeholder + <app-navigation [items]="items"></app-navigation> </div> </div>
El atributo
[items]=items
pasa@Input() items
deHeaderComponent
aNavigationComponent
, donde generará la navegación. -
Abra
header.component.spec.ts
y agregue una declaración paraNavigationComponent
: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(); }));
Dado que
NavigationComponent
se utiliza ahora como parte deHeaderComponent
, debe declararse como parte del banco de pruebas. -
Guardar cambios en cualquier archivo abierto y volver al servidor de desarrollo de Webpack: http://localhost:4200/
Abra la navegación haciendo clic en el botón de opción de menú y verá los vínculos de navegación rellenados. SPA Debe poder navegar a diferentes vistas de la página de inicio de la página de la página de la página de.
SPA Comprender el enrutamiento de la
AEM Ahora que la navegación ha sido implementada, inspeccione el enrutamiento en la dirección de correo electrónico de la.
-
En el IDE, abra el archivo
app-routing.module.ts
a lasui.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 {}
La matriz
routes: Routes = [];
define las rutas o rutas de navegación a las asignaciones de componentes de Angular.AemPageMatcher
es un enrutador de Angular AEM personalizado UrlMatcher, que coincide con cualquier elemento que "se parezca" a una página de la lista de páginas que forman parte de esta aplicación de Angular.PageComponent
es el componente de Angular AEM que representa una página en el entorno de segmentación de datos y se utiliza para representar las rutas coincidentes en el entorno de segmentación de datos.PageComponent
se revisa más adelante en el tutorial.AEM SPA
AemPageDataResolver
, proporcionado por el SDK de JS de Editor de de recursos, es un Angular AEM AEM Router Resolver personalizado que se usa para transformar la dirección URL de ruta, que es la ruta en la que se incluye la extensión .html, a la ruta de recurso en la ruta de acceso de la página, que es la ruta de acceso de la página, menos la extensión.Por ejemplo,
AemPageDataResolver
transforma la dirección URL de una ruta decontent/wknd-spa-angular/us/en/home.html
en una ruta de acceso de/content/wknd-spa-angular/us/en/home
. Se utiliza para resolver el contenido de la página en función de la ruta en la API del modelo JSON.AEM SPA
AemPageRouteReuseStrategy
, proporcionado por el SDK de JS del Editor de código de tiempo de ejecución (SDK) del Editor de código de tiempo de ejecución (SDK) del Editor de código de tiempo de ejecución (SDK) del Editor de código de tiempo, es un RouteReuseStrategy personalizado que evita la reutilización dePageComponent
en las rutas. De lo contrario, el contenido de la página "A" podría mostrarse al navegar a la página "B". -
Abra el archivo
page.component.ts
enui.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]; }); } }
AEM Se requiere
PageComponent
para procesar el JSON recuperado de los recursos y se utiliza como el componente de Angular para procesar las rutas.ActivatedRoute
, que proporciona el módulo Enrutador de Angular AEM, contiene el estado que indica qué contenido JSON de la página de debe cargarse en esta instancia de componente Página de Angular.ModelManagerService
, obtiene los datos JSON en función de la ruta y asigna los datos a las variables de clasepath
,items
,itemsOrder
. Estos se pasarán a AEMPageComponent -
Abrir el archivo
page.component.html
enui.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-page
incluye AEMPageComponent. Las variablespath
,items
yitemsOrder
se pasan aAEMPageComponent
. SPA ElAemPageComponent
, proporcionado mediante el SDK de JavaScript del Editor de, iterará estos datos e instanciará dinámicamente componentes de Angular basados en los datos JSON, tal como se ve en el tutorial de componentes de mapa.PageComponent
es realmente solo un proxy paraAEMPageComponent
y esAEMPageComponent
el que hace la mayor parte del trabajo pesado para asignar correctamente el modelo JSON a los componentes del Angular.
Inspect SPA AEM el enrutamiento de la en la
-
Abra un terminal y detenga webpack dev server si se inició. AEM Vaya a la raíz del proyecto e implemente el proyecto para que se ejecute con sus habilidades con Maven:
code language-shell $ cd aem-guides-wknd-spa $ mvn clean install -PautoInstallSinglePackage
note caution CAUTION El proyecto de Angular tiene habilitadas algunas reglas de vinculación muy estrictas. Si la generación de Maven falla, compruebe el error y busque Errores de Lint encontrados en los archivos enumerados.. Corrija los problemas que encuentre el filtro y vuelva a ejecutar el comando de Maven. -
SPA AEM Vaya a la página principal de la en la siguiente dirección: http://localhost:4502/content/wknd-spa-angular/us/en/home.html y abra las herramientas para desarrolladores del explorador. Las capturas de pantalla a continuación se capturan desde el navegador Google Chrome.
SPA Actualice la página y debería ver una solicitud XHR a
/content/wknd-spa-angular/us/en.model.json
, que es la raíz de la. SPA Tenga en cuenta que solo se incluyen tres páginas secundarias en función de la configuración de profundidad de jerarquía a la plantilla Raíz de realizada anteriormente en el tutorial. Esto no incluye Página 3.SPA
-
Con las herramientas para desarrolladores abiertas, vaya a Página 3:
Observe que se hace una nueva solicitud XHR a:
/content/wknd-spa-angular/us/en/home/page-2/page-3.model.json
AEM El Administrador de modelos de datos entiende que el contenido JSON de la página 3 no está disponible y déclencheur automáticamente la solicitud XHR adicional.
-
SPA Continúe navegando por la utilizando los distintos vínculos de navegación. Observe que no se realizan solicitudes XHR adicionales y que no se actualiza la página completa. SPA AEM Esto hace que el usuario final tenga una mayor rapidez en la ejecución de la solicitud y reduce las solicitudes innecesarias de nuevo a la fase de ejecución de la solicitud de la.
-
Experimente con vínculos profundos directamente a: http://localhost:4502/content/wknd-spa-angular/us/en/home/page-2.html. Observe que el botón Atrás del explorador sigue funcionando.
Enhorabuena. congratulations
SPA AEM SPA ¡Enhorabuena! Ha aprendido cómo se pueden admitir varias vistas en la asignando a páginas de la página con el SDK del editor de páginas (SDK) de la aplicación de la aplicación de la aplicación de la manera de. La navegación dinámica se ha implementado mediante el enrutamiento de Angular y se ha agregado al componente Header
.
Siempre puede ver el código terminado en GitHub o desprotegerlo localmente cambiando a la rama Angular/navigation-routing-solution
.
Siguientes pasos next-steps
AEM SPA Crear un componente personalizado: aprenda a crear un componente personalizado para utilizarlo con el Editor de. Aprenda a desarrollar cuadros de diálogo de autor y modelos Sling para ampliar el modelo JSON y rellenar un componente personalizado.