Angular elemek használata – Miért és hogyan? – 1. rész

Kezdés

Kezdjük azzal, hogy létrehozunk egy új Angular projektet a rendszerünkben. Ehhez győződjünk meg róla, hogy telepítve van az Angular CLI legújabb verziója. Futtassuk a következő parancsot a terminálban:

$ npm install -g @angular/cli

A telepítés befejezése után létrehozhatunk vele egy új kezdeti alkalmazást a rendszerünkben, így:

$ ng new angular-app

Ezután megkérdezzük, hogy milyen további funkciókat szeretnénk hozzáadni az Angular projektünkhöz, olyan dolgokat, mint az útválasztás és a stíluslap formátumának típusa. Válassza ki az alapértelmezett választ a Enter/Return billentyű lenyomásával.

A CLI telepíti a szükséges Angular csomagokat és függőségeket a angular-app nevű mappába. Ezt az alkalmazást a következő parancsok futtatásával szolgálhatjuk ki a böngészőnek:

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

Amint látjuk, az alkalmazás már tartalmaz néhány dolgot, amit megjeleníthetünk a képernyőn. De nincs rájuk szükségünk. Tehát menj vissza a kódszerkesztődbe (én ❤️ VS Code), és törölj ki mindent a src/app/app.component.html fájlon belül, és írj egyetlen <h1> elemet.

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

Ha megnézed a fájlszerkezetet, látni fogod, hogy az angularban minden komponens rengeteg fájlból áll. Csak a App komponenshez van egy .ts, .html, .css és egy spec.ts fájl, amely a teszteket tartalmazza, valamint egy module.ts fájl. Lesz még egy opcionális routing.module.ts fájl is, ha úgy döntöttünk, hogy a CLI segítségével történő létrehozás során hozzáadjuk az alkalmazáshoz az útválasztási funkciót.

Ahelyett, hogy mindezeket a fájlokat megírnánk a komponenseinkhez, az Angular CLI ad nekünk egy rövidített módszert, amely ezeket a fájlokat generálja helyettünk. Használjuk ezt a módszert egy HelloWorld komponens létrehozására a rendszerünkben.

$ ng g c HelloWorld

Ez az egyetlen parancs létrehoz egy hello-world nevű mappát a app mappán belül. Ha megnyitjuk ezt a fájlt, akkor ezt a 4 fájlt találjuk benne:

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

Mi csak a .html és .ts fájlt fogjuk használni. Vannak további zászlók, amelyeket átadhatunk a ng g c parancsnak. De annak érdekében, hogy a dolgok egyszerűek és lényegre törők legyenek, nem fogom őket használni. Nézd meg az Angular Docs-t, hogy többet tudj meg a parancs használatáról.

A hello-world.component.ts fájlban látni fogod, hogy a selector a app-hello-world-ra van állítva. Tehát, ha ezt hozzáadjuk a app.component.html-hez így:

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

Az hello-world.component.html tartalma fog megjelenni a böngészőben.

A kezdeti beállításunk most már készen van. Kezdjünk hozzá, hogyan használjuk az Angular elemeket.

Egy komponens átalakítása egyéni elemmé

Jelenleg van egy egyszerű HelloWorld komponensünk, amely egyszerűen kiír néhány szöveget a képernyőre. Nézzük meg, hogyan tudjuk ezt a komponenst dinamikusabban beilleszteni az alkalmazásba. Ehhez cseréljük le a app-hello-world-at egy div-ra és egy button-re. Adjuk hozzá a click hallgatót is a button-hez, hogy amikor valaki rákattint a gombra, megjelenhessen a HelloWorld komponens. Ezt egy showMessage() függvény fogja kezelni. Menjünk tehát a app.component.html oldalra, és végezzük el a következő módosításokat:

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

Ezután meg kell határoznunk a showMessage() függvényt a app.component.ts fájlban. Itt a szokásos DOM-manipulációt fogjuk használni a div kiválasztásával a hello id segítségével. Ezután a innerHTML függvényt fogjuk alkalmazni a app-hello-world komponens beillesztésére, így:

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

Mehetsz a böngésződbe, és rákattinthatsz a gombra, de már most megmondom, hogy semmi sem fog történni. De viszont, ha elmész a böngésző fejlesztői eszközeibe, és ott megnézed, látni fogod, hogy a HelloWorld komponens be van illesztve.

Azért nem látjuk a képernyőn a komponenst, mert az Angular nem ismeri fel a app-hello-world taget, mivel az dinamikusan került be a sablonba. Az Angularnak szüksége van arra, hogy az összes elem jelen legyen a sablonban, vagy a dinamikus komponensgyárat kell használnunk, hogy futásidőben a kódunkon keresztül instanciáljuk a komponenst.

Ez az a pont, ahol az Angular Elements a képbe kerül. Az Angular Element használatával csak annyit kell tennünk, hogy dinamikusan beillesztjük a taget, és maga az Angular fogja instanciálni helyettünk a komponenst. Nézzük meg végre, hogyan használhatjuk ezt a komponenst az alkalmazásunkban. Először is a ng add paranccsal telepítsük az Angular Elements-et az alkalmazásunkba:

$ ng add @angular/elements

Amikor ezt telepítettük, menjünk a app.module.ts-be, és végezzük el a következő módosításokat a @NgModule-ban:

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

Ezután a AppModule osztályban írjunk egy constructor függvényt, amely létrehoz egy új példányt a createCustomElement-ból, és adjuk át neki a HelloWorldComponent-t az alábbiak szerint:

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

A komponenssel együtt át kell adnunk neki a injector-t is. A injector olyasmi, amit a függőségek feloldására használunk. Ezzel létrehoztuk a HelloWorldComponent egy példányát, mint egyéni elemet. Ezután használhatjuk a customElements API-t, hogy a komponens címkéjét app-hello-world-ként definiáljuk.

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

Menjünk vissza a hello-world.component.ts fájlba, és távolítsuk el/jegyezzük be a selector-t a @Component szakaszon belül. Így az Angular nem fog összezavarodni, és tudni fogja használni az általunk most létrehozott egyéni elemet.

Futtassuk újra a ng serve --open parancsot, hogy megbizonyosodjunk arról, hogy az Angular átveszi az összes módosítást, amit most csináltunk.

Nagy esély van arra, hogy a gomb még mindig nem jeleníti meg a HelloWorldComponent-et. Ennek oka lehet, hogy az Angular “nem tudja felépíteni a HTMLElementet”. A probléma megoldásához telepítse a webcomponentjs polyfilleket:

$ yarn add @webcomponents/webcomponentsjs

Ezután menjen a polyfills.ts fájlba, és importálja a következőket:

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

Végre! Az egyéni elemünk megjelenik a képernyőn, amikor rákattintunk a gombra.