Utilizzare gli elementi Angular – Perché e come – Parte 1

Inizio

Iniziamo creando un nuovo progetto Angular nel nostro sistema. Per questo, assicuratevi di avere l’ultima versione di Angular CLI installata. Esegui il seguente comando nel tuo terminale:

$ npm install -g @angular/cli

Una volta che questa installazione è completa, possiamo usarla per creare una nuova applicazione iniziale nel nostro sistema come questa:

$ ng new angular-app

Ti verrà quindi chiesto di selezionare le caratteristiche aggiuntive che potresti voler aggiungere al tuo progetto Angular, cose come il routing e il tipo di formato del foglio di stile. Seleziona la risposta predefinita premendo il tasto Enter/Return.

La CLI installa i pacchetti Angular necessari e le dipendenze in una cartella chiamata angular-app. Puoi servire questa applicazione al browser eseguendo i seguenti comandi:

$ cd angular-app
$ ng serve --open
// --open flag will open the browser for you

Come puoi vedere, l’app contiene già alcune cose che possiamo visualizzare sullo schermo. Ma non ne abbiamo bisogno. Quindi tornate al vostro editor di codice (io ❤️ VS Code) e cancellate tutto all’interno del file src/app/app.component.html e scrivete un solo elemento <h1>.

<h1>Welcome To Angular Elements!</h1>

Se date un’occhiata alla struttura dei file, vedrete che ogni componente in angular consiste in una moltitudine di file. Per il solo componente App, c’è un file .ts, .html, .css, e un file spec.ts che contiene i test, e un file module.ts. Ci sarà anche un file routing.module.ts opzionale se avete scelto di aggiungere la funzione di routing all’applicazione mentre la create usando la CLI.

Invece di scrivere tutti questi file per i nostri componenti, Angular CLI ci dà un metodo abbreviato che genererà questi file per noi. Usiamo questo metodo per creare un componente HelloWorld nel nostro sistema.

$ ng g c HelloWorld

Questo singolo comando creerà una cartella chiamata hello-world dentro la cartella app. Se aprite questo file, troverete questi 4 file al suo interno:

  • hello-world.component.css
  • hello-world.component.html
  • hello-world.component.spec.ts
  • hello-world.component.ts

Noi useremo solo il file .html e .ts. Ci sono altri flag che possiamo passare al comando ng g c. Ma per mantenere le cose semplici e puntuali, non le userò. Controlla Angular Docs per saperne di più su come usare questo comando.

Nel file hello-world.component.ts, vedrai che il selector è impostato su app-hello-world. Quindi, se aggiungi questo al app.component.html in questo modo:

<h1>Welcome To Angular Elements</h1>
<app-hello-world></app-hello-world>

Allora il contenuto di hello-world.component.html sarà visualizzato nel browser.

La nostra configurazione iniziale è ora pronta. Cominciamo con l’uso di Angular Elements.

Convertire un componente in un elemento personalizzato

In questo momento, abbiamo un semplice componente HelloWorld che stampa semplicemente del testo sullo schermo. Diamo un’occhiata a come possiamo inserire questo componente nell’applicazione in modo più dinamico. Per farlo, sostituiamo il app-hello-world con un div e un button. Aggiungiamo anche l’ascoltatore click al button, in modo che quando qualcuno fa clic sul pulsante, il componente HelloWorld possa essere visualizzato. Questo sarà gestito da una funzione showMessage(). Quindi vai alla pagina app.component.html e fai queste modifiche:

<h1>Welcome To Angular Elements</h1>
<div></div>
<button (click)="showMessage()">Display?</button>

Poi dobbiamo definire la funzione showMessage() nel file app.component.ts. Qui useremo la normale manipolazione DOM per ottenere il div selezionandolo con il suo id di hello. Poi, applicheremo la funzione innerHTML per inserire il componente app-hello-world in questo modo:

export class AppComponent {
showMessage() {
const hello = document.getElementById('hello');
hello.innerHTML = '<app-hello-world></app-hello-world>';
}
}

Potete andare nel vostro browser e cliccare sul pulsante, ma vi dico subito che non succederà nulla. Ma poi di nuovo, se vai negli strumenti di sviluppo del browser e guardi lì, vedrai che il componente HelloWorld è inserito.

La ragione per cui non possiamo vedere il componente sullo schermo è che Angular non può riconoscere il tag app-hello-world poiché è stato inserito nel template dinamicamente. Angular ha bisogno che tutti gli elementi siano presenti nel template, oppure è necessario utilizzare la fabbrica di componenti dinamici per istanziare il componente in fase di esecuzione attraverso il vostro codice.

È qui che entra in gioco Angular Elements. Usando Angular Element, tutto quello che dobbiamo fare è inserire il tag dinamicamente, e Angular stesso istanzierà il componente per noi. Vediamo finalmente come utilizzare questo componente nella nostra app. Per prima cosa, usate il comando ng add per installare Angular Elements nella nostra app:

$ ng add @angular/elements

Una volta installato, andate in app.module.ts e fate le seguenti modifiche al @NgModule:

import {NgModule, Injector} from '@angular/core';
import {createCustomeElement} from '@angular/elements';
@NgModule({
declarations: ,
imports: ,
entryComponents: ,
providers: ,
bootstrap:
})

Poi nella classe AppModule, scrivete una funzione constructor per creare una nuova istanza del createCustomElement e passategli il HelloWorldComponent come mostrato qui sotto:

export class AppModule {
constructor(injector: Injector) {
const custom = createCustomElement(HelloWorldComponent, {injector: injector});
}
}

Insieme al componente, dobbiamo anche passargli il injector. Il injector è qualcosa che usiamo per risolvere le dipendenze. Con questo, abbiamo creato un’istanza del HelloWorldComponent come elemento personalizzato. Possiamo quindi utilizzare l’API customElements per definire il tag del componente come app-hello-world.

customElements.define('app-hello-world', custom);

Torna al file hello-world.component.ts e rimuovi/commenta il selector dentro la sezione @Component. In questo modo, Angular non si confonderà e saprà usare l’elemento personalizzato che abbiamo appena creato.

Riesegui il comando ng serve --open per assicurarti che Angular prenda tutte le modifiche che abbiamo appena fatto.

C’è una buona possibilità che il pulsante non mostri ancora il HelloWorldComponent. Questo può essere dovuto al fatto che Angular “non riesce a costruire l’HTMLElement”. Per risolvere questo problema, installate i polyfill webcomponentjs:

$ yarn add @webcomponents/webcomponentsjs

Poi, andate nel file polyfills.ts e importate quanto segue:

import '@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js';

Finalmente! Il nostro elemento personalizzato verrà visualizzato sullo schermo quando clicchiamo su quel pulsante.