CustomElementRegistry
d'éléments personnalisés définis (également appelés composants Web),
qui mappe une classe JavaScript instanciable à une balise HTML.@angular/elements
exporte une API createCustomElement()
fournissant un pont entre l'interface de composant et la fonctionnalité de
détection des modifications d'Angular et l'API DOM intégrée.‹code-snippet›
effectuant des opérations complexes.
Il vous suffit d'indiquer à votre fournisseur de contenu la syntaxe de votre élément personnalisé.
Ils n'ont besoin de rien savoir sur Angular, ni sur les structures de données ou l'implémentation de votre composant.createCustomElement()
pour convertir un composant en une classe pouvant être enregistrée avec le navigateur en tant qu'élément personnalisé.
Une fois que vous avez inscrit votre classe configurée dans le registre des éléments personnalisés du navigateur, vous pouvez utiliser le nouvel élément comme un
élément HTML intégré au contenu que vous ajoutez directement dans le DOM :createCustomElement()
permettant de convertir un composant Angular, ainsi que ses dépendances, en un élément personnalisé.
La fonction collecte les propriétés observables du composant, ainsi que la fonctionnalité Angular dont le navigateur a besoin pour créer et détruire des instances,
ainsi que pour détecter les modifications et y répondre.NgElementConstructor
et crée une classe de constructeur configurée pour produire une instance à amorçage automatique de votre composant.customElements.define()
pour enregistrer le constructeur configuré et sa balise d'élément personnalisé associée avec le navigateur CustomElementRegistry
.
Lorsque le navigateur rencontre la balise de l'élément enregistré, il utilise le constructeur pour créer une instance d'élément personnalisé.@Input('myInputProp') inputProp
,
l'élément personnalisé correspondant définit un attribut my-input-prop
.@Output() valueChanged = new EventEmitter()
, l'élément personnalisé correspondant enverra des événements avec le nom "valueChanged"
et les données émises seront stockées dans la propriété detail de l'événement.
Si vous fournissez un alias, cette valeur est utilisée. Par exemple @Output('myClick') clicks = new EventEmitter‹string›();
,
des événements de répartition portant le nom "myClick" sont générés.Navigateur | Support d'éléments personnalisés |
---|---|
Chrome | Soutenu nativement. |
Opéra | Soutenu nativement. |
Safari | Soutenu nativement. |
Firefox | Pris en charge nativement à partir de la version 63. Dans les versions antérieures: définissez les préférences dom.webcomponents.enabledet dom.webcomponents.customelements.enabledsur true. |
Bord | Travailler sur une implémentation. |
tsconfig.json
.
Etant donné que la prise en charge de Custom Element et ES2015 peut ne pas être disponible dans tous les navigateurs,
les développeurs peuvent à la place choisir d'utiliser un polyfill pour prendre en charge les anciens navigateurs et le code ES5.entryComponents
, de sorte que l'application ne s'attendrait
pas à ce qu'elle soit présente au démarrage, puis vous devrez le charger, l'attacher à un élément du DOM et relier tous les éléments.
les dépendances, la détection des modifications et la gestion des événements, comme décrit dans Dynamic Component Loader.popup.component.ts
définit un simple élément contextuel qui affiche un message d'entrée, avec quelques animations et styles.popup.service.ts
crée un service injectable qui fournit deux méthodes différentes pour appeler PopupComponent
; en tant que composant dynamique ou en tant qu'élément personnalisé. Notez combien de configuration supplémentaire est nécessaire pour la méthode de chargement dynamique.app.module.ts
ajoute le PopupComponent
à la liste entryComponents
du module , pour l'exclure de la compilation et éviter les avertissements ou les erreurs de démarrage.app.component.ts
définit le composant racine de l'application, qui utilise PopupService
pour ajouter la fenêtre contextuelle au DOM lors de l'exécution. Lorsque l'application est exécutée, le constructeur du composant racine convertit PopupComponent
en un élément personnalisé.popup.component.ts
popup.service.ts
app.module.ts
app.component.ts
document.createElement()
ou document.querySelector()
, renvoient un type d'élément approprié pour les arguments spécifiés.
Par exemple, l'appel de document.createElement('a')
retournera un HTMLAnchorElement
, TypeScript
sait avoir une propriété href
.
De la même manière document.createElement('div')
, retournera HTMLDivElement
, TypeScript
sait qu'il n'a pas de propriété href
.popup-element
dans notre exemple),
les méthodes renverront un type générique, tel que HTMLELement
, puisque TypeScript
ne peut pas déduire le type correct de l'élément renvoyé.NgElement
(qui à son tour étend HTMLElement
).
De plus, ces éléments personnalisés auront une propriété pour chaque entrée du composant correspondant.
Par exemple, notre popup-element
aura une propriété message
de type string.my-dialog
personnalisé basé sur le composant suivant :NgElement
et WithProperties
(exportés depuis @angular/elements
) :HTMLELementTagNameMap
,
qu'il utilise pour déduire le type d'un élément retourné en fonction de son nom de la balise (pour les méthodes DOM telles que document.createElement()
, document.querySelector()
, etc.) :