Aan de slag met SPA in AEM Angular gebruiken getting-started-with-spas-in-aem-using-angular
Toepassingen op één pagina (SPA) kunnen aantrekkelijke ervaringen bieden voor websitegebruikers. Ontwikkelaars willen sites kunnen maken met behulp van SPA frameworks en auteurs willen inhoud naadloos bewerken binnen AEM voor een site die is gebouwd met behulp van SPA frameworks.
De SPA ontwerpfunctie biedt een uitgebreide oplossing voor het ondersteunen van SPA binnen AEM. Dit artikel presenteert een vereenvoudigde SPA toepassing over het kader van de Angular, verklaart hoe het wordt samengesteld, die u toestaat om met uw eigen SPA snel in werking te stellen.
Inleiding introduction
Dit artikel vat het basisfunctioneren van een eenvoudige SPA en het minimum samen dat u moet weten om van u lopend te krijgen.
Raadpleeg de volgende documenten voor meer informatie over SPA werken in AEM:
Dit document loopt door de structuur van een vereenvoudigde SPA en illustreert hoe het werkt zodat u deze interpretatie op uw eigen SPA kunt toepassen.
Afhankelijkheden, configuratie en gebouwen dependencies-configuration-and-building
Naast de verwachte afhankelijkheid van de Angular, kan de steekproef SPA extra bibliotheken gebruiken om de verwezenlijking van SPA efficiënter te maken.
Afhankelijkheden dependencies
Het bestand package.json
definieert de vereisten van het algemene SPA. De minimum vereiste AEM gebiedsdelen zijn hier vermeld.
"dependencies": {
"@adobe/aem-angular-editable-components": "~1.0.3",
"@adobe/aem-spa-component-mapping": "~1.0.5",
"@adobe/aem-spa-page-model-manager": "~1.0.3"
}
aem-clientlib-generator
wordt gebruikt om het maken van clientbibliotheken automatisch te maken als onderdeel van het ontwikkelproces.
"aem-clientlib-generator": "^1.4.1",
Voor verdere details zie aem-clientlib-generator op GitHub.
aem-clientlib-generator
wordt als volgt geconfigureerd in het clientlib.config.js
-bestand.
module.exports = {
// default working directory (can be changed per 'cwd' in every asset option)
context: __dirname,
// path to the clientlib root folder (output)
clientLibRoot: "./../content/jcr_root/apps/my-angular-app/clientlibs",
libs: {
name: "my-angular-app",
allowProxy: true,
categories: ["my-angular-app"],
embed: ["my-angular-app.responsivegrid"],
jsProcessor: ["min:gcc"],
serializationFormat: "xml",
assets: {
js: [
"dist/**/*.js"
],
css: [
"dist/**/*.css"
]
}
}
};
Gebouw building
Eigenlijk bouwend app gebruikt Webpackvoor transpilatie naast aem-client-clientlib-generator voor de automatische verwezenlijking van de cliëntbibliotheek. Daarom zal het bouwstijlbevel op lijken:
"build": "ng build --build-optimizer=false && clientlib",
Nadat het pakket is gemaakt, kan het naar een AEM-instantie worden geüpload.
Projectarchetype AEM aem-project-archetype
Om het even welk AEM project zou AEM Archetype van het Projectmoeten gebruiken, dat SPA projecten gebruikend React of Angular steunt en SPA SDK gebruikt.
Toepassingsstructuur application-structure
Als u de afhankelijkheden opneemt en uw app samenstelt zoals eerder beschreven, blijft er een werkende SPA over die u kunt uploaden naar uw AEM-exemplaar.
In het volgende gedeelte van dit document wordt uitgelegd hoe een SPA in AEM is gestructureerd, welke belangrijke bestanden de toepassing sturen en hoe deze samenwerken.
Een vereenvoudigde afbeeldingscomponent wordt als voorbeeld gebruikt, maar alle componenten van de toepassing zijn op hetzelfde concept gebaseerd.
app.module.ts app-module-ts
Het ingangspunt in de SPA is het app.module.ts
bestand dat hier wordt weergegeven en dat u zich op de belangrijke inhoud wilt concentreren.
// app.module.ts
import { BrowserModule, BrowserTransferStateModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { SpaAngularEditableComponentsModule } from '@adobe/aem-angular-editable-components';
import { AppRoutingModule } from './app-routing.module';
@NgModule({
imports: [ BrowserModule.withServerTransition({ appId: 'my-angular-app' }),
SpaAngularEditableComponentsModule,
AppRoutingModule,
BrowserTransferStateModule ],
providers: ...,
declarations: [ ... ],
entryComponents: [ ... ],
bootstrap: [ AppComponent ]
})
export class AppModule {}
Het bestand app.module.ts
is het beginpunt van de app en bevat de initiële projectconfiguratie en gebruikt AppComponent
om de app op te starten.
Statische instantie static-instantiation
Wanneer de component statisch wordt geconcretiseerd gebruikend het componentenmalplaatje, moet de waarde van het model tot de eigenschappen van de component worden overgegaan. De waarden van het model worden doorgegeven als kenmerken die later beschikbaar moeten zijn als componenteigenschappen.
app.component.ts app-component-ts
Zodra app.module.ts
bootstraps AppComponent
, kan het de app dan initialiseren, die hier in een vereenvoudigde versie wordt getoond om zich op de belangrijke inhoud te concentreren.
// app.component.ts
import { Component } from '@angular/core';
import { ModelManager } from '@adobe/aem-spa-page-model-manager';
import { Constants } from "@adobe/aem-angular-editable-components";
@Component({
selector: 'app-root',
template: `
<router-outlet></router-outlet>
`
})
export class AppComponent {
items;
itemsOrder;
path;
constructor() {
ModelManager.initialize().then(this.updateData.bind(this));
}
private updateData(model) {
this.path = model[Constants.PATH_PROP];
this.items = model[Constants.ITEMS_PROP];
this.itemsOrder = model[Constants.ITEMS_ORDER_PROP];
}
}
main-content.component.ts main-content-component-ts
Door de pagina te verwerken, worden app.component.ts
aanroepen main-content.component.ts
hier in een vereenvoudigde versie weergegeven.
import { Component } from '@angular/core';
import { ModelManagerService } from '../model-manager.service';
import { ActivatedRoute } from '@angular/router';
import { Constants } from "@adobe/aem-angular-editable-components";
@Component({
selector: 'app-main',
template: `
<aem-page class="structure-page" [attr.data-cq-page-path]="path" [cqPath]="path" [cqItems]="items" [cqItemsOrder]="itemsOrder" ></aem-page>
`
})
export class MainContentComponent {
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];
});
}
}
MainComponent
neemt de JSON-representatie van het paginamodel op en verwerkt de inhoud om elk element van de pagina te buigen of te versieren. De verdere details op Page
kunnen in het document SPA Vervagenworden gevonden.
image.component.ts image-component-ts
Page
bestaat uit componenten. Als de JSON wordt ingesloten, kan de Page
die componenten zoals image.component.ts
verwerken, zoals hier wordt getoond.
/// image.component.ts
import { Component, Input } from '@angular/core';
const ImageEditConfig = {
emptyLabel: 'Image',
isEmpty: function(cqModel) {
return !cqModel || !cqModel.src || cqModel.src.trim().length < 1;
}
};
@Component({
selector: 'app-image',
templateUrl: './image.component.html',
})
export class ImageComponent {
@Input() src: string;
@Input() alt: string;
@Input() title: string;
}
MapTo('my-angular-app/components/image')(ImageComponent, ImageEditConfig);
Het centrale idee van SPA in AEM is het idee om SPA componenten aan AEM componenten in kaart te brengen en de component bij te werken wanneer de inhoud (en omgekeerd) wordt gewijzigd. Zie het document SPA het Overzicht van de Redacteurvoor een samenvatting van dit communicatie model.
MapTo('my-angular-app/components/image')(Image, ImageEditConfig);
De methode MapTo
wijst de SPA component aan de AEM toe. Het ondersteunt het gebruik van één tekenreeks of een array van tekenreeksen.
ImageEditConfig
is een configuratieobject dat de ontwerpmogelijkheden van een component helpt in te schakelen door de vereiste metagegevens voor de editor op te geven om plaatsaanduidingen te genereren
Als er geen inhoud is, worden etiketten verstrekt als placeholders om de lege inhoud te vertegenwoordigen.
Dynamisch doorgegeven eigenschappen dynamically-passed-properties
De gegevens uit het model worden dynamisch doorgegeven als eigenschappen van de component.
image.component.html image-component-html
Ten slotte kan de afbeelding worden gerenderd in image.component.html
.
// image.component.html
<img [src]="src" [alt]="alt" [title]="title"/>
Informatie delen tussen SPA componenten sharing-information-between-spa-components
Componenten in een toepassing van één pagina moeten regelmatig informatie uitwisselen. Er zijn verschillende aanbevolen manieren om dit te doen, die als volgt worden opgesomd in toenemende mate van complexiteit.
- Optie 1: centraliseer de logica en uitzending aan de noodzakelijke componenten bijvoorbeeld, door een util klasse als zuivere object-oriented oplossing te gebruiken.
- Optie 2: de componentenstaten van het Aandeel door een staatsbibliotheek zoals NgRx te gebruiken.
- Optie 3: hefboomwerking de objecten hiërarchie door de containercomponent aan te passen en uit te breiden.
Volgende stappen next-steps
- Begonnen het Worden met SPA in AEM gebruiken Reageerttoont hoe een basisSPA wordt gebouwd om met de SPA Redacteur in AEM te werken gebruikend Reageren.
- SPA het Overzicht van de Redacteurgaat in meer diepte in het communicatie model tussen AEM en de SPA.
- WKND SPA Projectis een geleidelijke leerprogramma die een eenvoudig SPA project in AEM uitvoeren.
- Dynamisch Model aan de Toewijzing van de Component voor SPAverklaart het dynamische model aan componentenafbeelding en hoe het binnen SPA in AEM werkt.
- SPA Vervagenbiedt een diepe duik in hoe SPA SDK voor AEM werkt voor het geval u SPA in AEM voor een kader buiten Reageren of Angular wilt uitvoeren of eenvoudig een dieper begrip zou willen.