Angular
Die Komponenten Schritt für Schritt in eine Angular-Anwendung einbauen.
Angular braucht ein einziges Schema-Flag, um die Tags zu akzeptieren. Danach greifen seine Property- und Event-Bindings direkt auf die Komponenten, ohne Wrapper-Bibliothek und ohne Übersetzung der Event-Namen.
1. Installieren
Die Design-Tokens in die globalen Styles aufnehmen:
2. Elemente registrieren
Der Import der Bibliothek registriert jedes Tag. Einmal in main.ts, bevor die
Anwendung bootstrappt:
Mit Server-Side Rendering bleibt dieser Import ausserhalb des Server-Bundles,
denn die Elemente erweitern HTMLElement, das der Server nicht hat:
3. Tags erlauben
Ohne das Schema meldet Angular 'tuix-button' is not a known element.
4. Verwenden
[prop] setzt eine DOM-Property, Objekte und Arrays funktionieren also
unverändert, und (event) hört auf genau diesen Namen, auch auf camelCase:
Enums im Template brauchen ein Feld (readonly IconName = IconName) oder werden
als einfache Strings geschrieben: iconright="building".
5. Formulare
Die Elemente sind keine Form Controls, formControlName braucht deshalb einen
ControlValueAccessor. Eine kleine Direktive pro Elementtyp genügt und ist in
der ganzen Anwendung wiederverwendbar:
Mit der Direktive in der Komponente verhält sich das Element wie jedes andere Control:
Für Checkbox und Toggle gilt dieselbe Form der Direktive, mit (change) als
Host-Listener und checked als Property.
6. Change Detection
Die Events sind gewöhnliche DOM-Events, die Zone von Angular bekommt sie also
mit, und ein Template, das an das aktualisierte Feld gebunden ist, rendert von
selbst neu. Mit OnPush und einem Signal oder der async-Pipe braucht es
ebenfalls nichts Zusätzliches. Nur ein in ngZone.runOutsideAngular
registrierter Listener muss mit ngZone.run() zurückkehren.
Fehlersuche
| Symptom | Ursache |
|---|---|
'tuix-button' is not a known element | CUSTOM_ELEMENTS_SCHEMA fehlt in der Komponente oder im Modul |
HTMLElement is not defined auf dem Server | Die Bibliothek wird in Code importiert, der beim SSR läuft; mit isPlatformBrowser absichern |
Can't bind to 'options'… | Das Schema fehlt; mit ihm werden unbekannte Bindings als DOM-Properties gesetzt |
Das Control bleibt bei formControlName leer | Kein ControlValueAccessor; die Direktive aus Schritt 5 ergänzen |
IconName is not defined im Template | Enums müssen als Feld der Komponente bereitgestellt werden |