Introduksjon til Angular-direktiver
En kjernefunksjon i Angular er bruken av direktiver. Disse direktivene gjør det mulig å legge til spesifikk oppførsel i DOM-elementer. Angular har et sett med innebygde direktiver, men det fleksible rammeverket tillater også utviklere å lage egne tilpassede varianter.
Hva er Direktiver?
Direktiver kan betraktes som skreddersydde kodesnutter som Angular bruker for å endre hvordan et HTML-element oppfører seg eller ser ut. Du kan bruke direktiver til å legge til hendelseslyttere, modifisere DOM-strukturen, eller til å vise eller skjule elementer på dynamisk vis.
Angular skiller mellom to hovedtyper av innebygde direktiver: strukturelle og attributt-direktiver. Strukturelle direktiver endrer selve strukturen i DOM, for eksempel ved å legge til eller fjerne elementer. Attributt-direktiver, derimot, påvirker utseendet eller oppførselen til et eksisterende element. Direktiver gir en effektiv metode for å utvide funksjonaliteten til Angular-komponenter.
Fordeler med å bruke Direktiver
Direktiver i Angular tilbyr flere betydelige fordeler:
- Gjenbruk: Direktiver kan benyttes på tvers av forskjellige komponenter, noe som gir økt effektivitet og tidsbesparelser.
- Utvidbarhet: Direktiver kan utvides med ny funksjonalitet, noe som gjør komponentene mer allsidige og kraftige.
- Fleksibilitet: Ved å bruke direktiver kan du endre oppførselen eller utseendet til et element på mange måter, noe som gir stor frihet i utviklingen av applikasjoner.
Oppsett av en Angular-applikasjon
For å begynne å bruke Angular, må du installere Angular CLI. Dette gjøres ved å kjøre følgende kommando i terminalen:
npm install -g @angular/cli
Etter installasjonen av Angular CLI kan du opprette et nytt Angular-prosjekt med denne kommandoen:
ng new custom-directives-app
Denne kommandoen oppretter et prosjekt med navnet «custom-directives-app».
Opprettelse av et Egendefinert Direktiv
Med et fungerende Angular-prosjekt, kan du nå begynne å utvikle dine egne direktiver. Dette starter med å opprette en TypeScript-fil og definere en klasse som er dekorert med «@Directive»-dekoratoren.
«@Directive»-dekoratoren er en TypeScript-dekorator som brukes til å definere egendefinerte direktiver. Opprett en fil med navnet «highlight.directive.ts» i mappen «src/app». I denne filen implementerer du et tilpasset direktiv for å fremheve elementer.
Eksempelkode for å starte et direktiv:
import { Directive } from "@angular/core"; @Directive({ selector: "[myHighlight]", }) export class HighlightDirective { constructor() {} }
Koden ovenfor importerer «@Directive»-dekoratoren fra «@angular/core»-modulen. «@Directive»-dekoratoren knyttes til «HighlightDirective»-klassen. Den tar et objekt som argument med en «selector»-egenskap.
I dette tilfellet settes «selector»-egenskapen til «[myHighlight]». Dette betyr at du kan bruke direktivet i HTML-malene ved å legge til attributtet «myHighlight» til et hvilket som helst element.
Eksempel på bruk av direktivet i en mal:
<main> <p myHighlight>En tekst som skal fremheves</p> </main>
Legge til Funksjonalitet i Direktivet
Når et direktiv er opprettet, er neste trinn å legge til funksjonalitet slik at det kan manipulere DOM. For å gjøre dette, trenger du «ElementRef» fra «@angular/core».
«ElementRef» injiseres i direktivets konstruktør. «ElementRef» gir tilgang til det underliggende DOM-elementet i en visning.
Her er et eksempel på hvordan du legger til funksjonalitet i et direktiv:
import { Directive, ElementRef } from "@angular/core"; @Directive({ selector: "[myHighlight]" }) export class HighlightDirective { constructor(private element: ElementRef) { this.element.nativeElement.style.backgroundColor="lightblue"; } }
I dette eksemplet tar konstruktøren av «HighlightDirective»-klassen en «ElementRef»-parameter. Angular sørger for at denne referansen injiseres automatisk. «ElementRef» gir deg direkte tilgang til DOM-elementet.
Gjennom «this.element.nativeElement»-egenskapen får du tilgang til det faktiske DOM-elementet. Deretter setter du bakgrunnsfargen til lys blå med «style»-egenskapen. Dette betyr at hvert element som benytter «myHighlight»-direktivet, vil få en lys blå bakgrunn.
For at direktivet skal fungere, må du importere det og deklarere det i «app.module.ts»-filen.
For eksempel:
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { HighlightDirective } from './highlight.directive'; @NgModule({ declarations: [ AppComponent, HighlightDirective, ], imports: [ BrowserModule, AppRoutingModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
Nå kan du bruke «myHighlight»-direktivet i dine Angular-komponenter.
Eksempel på bruk i en mal:
<main> <p myHighlight>Denne teksten er lys blå.</p> </main>
Kjør applikasjonen på utviklingsserveren for å teste at direktivet fungerer. Dette gjøres med denne kommandoen i terminalen:
ng serve
Etter kommandoen er utført, gå til «http://localhost:4200/» i nettleseren. Du vil se at teksten du har merket med direktivet, nå har en lys blå bakgrunn. Se eksempelet under.
Innebygde direktiver i Angular kan akseptere verdier for å endre elementets utseende. Det egendefinerte direktivet «myHighlight» gjør det ikke i utgangspunktet. Du kan imidlertid konfigurere direktivet til å akseptere en verdi som brukes dynamisk for å sette bakgrunnsfarge.
For å gjøre dette, erstatt koden i «highlight.directive.ts» med denne:
import { Directive, ElementRef, Input } from "@angular/core"; @Directive({ selector: "[myHighlight]" }) export class HighlightDirective { @Input() set myHighlight(color: string) { this.element.nativeElement.style.backgroundColor = color; } constructor(private element: ElementRef) { } }
I kodeblokken over inneholder «HighlightDirective»-klassen en setter-metode kalt «myHighlight». Denne metoden aksepterer en farge-parameter som er av typen «string». Setter-metoden er dekorert med «@Input»-dekoratoren, slik at fargeverdien kan sendes inn til direktivet fra den overordnede komponenten.
Nå kan bakgrunnsfargen bestemmes ved å sende en verdi til «myHighlight»-direktivet.
Eksempel:
<main> <p myHighlight="pink">Denne teksten har rosa bakgrunn.</p> </main>
Opprettelse av et Egendefinert Strukturelt Direktiv
Tidligere har du lært å opprette, legge til funksjonalitet og bruke egendefinerte attributtdirektiver. Attributtdirektiver endrer utseendet til eksisterende DOM-elementer, mens strukturelle direktiver, som vi ser på nå, brukes til å legge til, fjerne eller flytte elementer i DOM.
Angular har to innebygde strukturelle direktiver: «ngFor» og «ngIf». «ngFor»-direktivet gjengir en mal for hvert element i en samling, mens «ngIf» håndterer betinget gjengivelse.
I denne delen skal du opprette et eget strukturelt direktiv som ligner på «ngIf». For å gjøre dette, opprett en fil med navnet «condition.directive.ts».
I «condition.directive.ts»-filen, legg til følgende kode:
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core' @Directive({ selector: "[condition]" }) export class ConditionDirective { @Input() set condition(arg: boolean) { if(arg) { this.viewContainer.createEmbeddedView(this.template) } else { this.viewContainer.clear(); } } constructor( private template: TemplateRef<unknown>, private viewContainer: ViewContainerRef ) {} }
Denne koden gjør det mulig å betinget gjengi elementer ved å bruke «condition»-direktivet og sende en boolsk verdi fra den overordnede komponenten.
I konstruktøren til «ConditionDirective»-klassen injiseres en instans av «TemplateRef» og «ViewContainerRef». «TemplateRef» representerer malen som direktivet er knyttet til, og «ViewContainerRef» representerer beholderen der applikasjonen gjengir visninger.
Setter-metoden «ConditionDirective» bruker en if-else-setning for å sjekke «arg»-parameteren. Direktivet oppretter en innebygd visning ved å bruke den gitte malen hvis parameteren er sann. «createEmbeddedView»-metoden til «ViewContainerRef»-klassen brukes til å opprette og gjengi visningen i DOM.
Hvis parameteren er usann, fjerner direktivet alle tidligere gjengitte visninger fra DOM med «clear»-metoden til «ViewContainerRef»-klassen.
Etter å ha opprettet direktivet, må det registreres i prosjektet ved å importeres og deklareres i «app.module.ts»-filen. Når dette er gjort, kan direktivet brukes i malene.
Eksempel på bruk i en mal:
<main> <p *condition="true">Denne teksten vises betinget.</p> </main>
Du kan nå opprette Egendefinerte Direktiver
Egendefinerte direktiver i Angular er en kraftfull metode for å manipulere DOM og legge til dynamisk oppførsel i malene dine. Du har nå lært å opprette og bruke både egendefinerte attributt- og strukturelle direktiver i dine Angular-applikasjoner. Med denne kunnskapen kan du utnytte mulighetene i Angular fullt ut.