Avez-vous vérifié ces documents officiels?
HostListener - Déclare un écouteur hôte. Angular appellera la méthode décorée lorsque l'élément hôte émettra l'événement spécifié.
@HostListener
- écoutera l'événement émis par l'élément hôte déclaré avec @HostListener
.
HostBinding - Déclare une liaison de propriété d'hôte. Angular vérifie automatiquement les liaisons des propriétés de l'hôte lors de la détection des modifications. Si une liaison change, elle mettra à jour l'élément hôte de la directive.
@HostBinding
- liera la propriété à l'élément hôte, si une liaison change, HostBinding
mettra à jour l'élément hôte.
REMARQUE: les deux liens ont été supprimés récemment. La partie " HostBinding-HostListening " du guide de style peut être une alternative utile jusqu'au retour des liens.
Voici un exemple de code simple pour vous aider à comprendre ce que cela signifie:
DEMO: Voici la démo en direct dans plunker - "Un exemple simple sur @HostListener & @HostBinding"
- Cet exemple lie une
role
propriété - déclarée avec @HostBinding
- à l'élément de l'hôte
- Rappelez-vous que
role
c'est un attribut, puisque nous utilisons attr.role
.
<p myDir>
devient <p mydir="" role="admin">
lorsque vous l'affichez dans les outils de développement.
- Il écoute ensuite l'
onClick
événement déclaré avec @HostListener
, attaché à l'élément hôte du composant, changeant role
à chaque clic.
- Le changement lorsque l'utilisateur
<p myDir>
clique sur est que sa balise d'ouverture change de <p mydir="" role="admin">
à <p mydir="" role="guest">
et de retour.
directives.ts
import {Component,HostListener,Directive,HostBinding,Input} from '@angular/core';
@Directive({selector: '[myDir]'})
export class HostDirective {
@HostBinding('attr.role') role = 'admin';
@HostListener('click') onClick() {
this.role= this.role === 'admin' ? 'guest' : 'admin';
}
}
AppComponent.ts
import { Component,ElementRef,ViewChild } from '@angular/core';
import {HostDirective} from './directives';
@Component({
selector: 'my-app',
template:
`
<p myDir>Host Element
<br><br>
We have a (HostListener) listening to this host's <b>click event</b> declared with @HostListener
<br><br>
And we have a (HostBinding) binding <b>the role property</b> to host element declared with @HostBinding
and checking host's property binding updates.
If any property change is found I will update it.
</p>
<div>View this change in the DOM of the host element by opening developer tools,
clicking the host element in the UI.
The role attribute's changes will be visible in the DOM.</div>
`,
directives: [HostDirective]
})
export class AppComponent {}
Un petit conseil qui m'aide à me souvenir de ce qu'ils font -
HostBinding('value') myValue;
est exactement le même que[value]="myValue"
Et
HostListener('click') myClick(){ }
est exactement le même que(click)="myClick()"
HostBinding
etHostListener
sont écrits dans des directives et les autres(...)
et[..]
sont écrits dans des modèles (de composants).la source
@HostListener
est la voie à suivre lorsque vous n'avez rien sur le DOM pour la liaison d'événement typique, comme la saisie au clavier dans mon cas.Voici un exemple de survol de base.
Propriété de modèle du composant:
Modèle
Et notre directive
la source
Une autre chose intéressante
@HostBinding
est que vous pouvez le combiner avec@Input
si votre liaison repose directement sur une entrée, par exemple:la source
@Input()
?@HostBinding
. Quand avez-vous besoin de l'utiliser@Input
?Une chose qui ajoute de la confusion à ce sujet est que l'idée des décorateurs n'est pas très claire, et quand on considère quelque chose comme ...
Cela fonctionne, car c'est un
get
accesseur . Vous ne pouvez pas utiliser une fonction équivalente:Sinon, l'avantage de l'utilisation
@HostBinding
est qu'elle garantit que la détection des modifications est exécutée lorsque la valeur liée change.la source
Résumé:
@HostBinding
: Ce décorateur lie une propriété de classe à une propriété de l'élément hôte.@HostListener
: Ce décorateur lie une méthode de classe à un événement de l'élément hôte.Exemple:
Dans l'exemple ci-dessus, ce qui suit se produit:
color
propriété de notreAppComponent
classe est liée à lastyle.color
propriété du composant. Ainsi, chaque fois que lacolor
propriété est mise à jour, lastyle.color
propriété de notre composant le sera aussiUtilisation en
@Directive
:Bien qu'il puisse être utilisé sur un composant, ces décorateurs sont souvent utilisés dans des directives d'attribut. Lorsqu'il est utilisé dans un
@Directive
hôte, l'élément sur lequel la directive est placée change. Par exemple, jetez un œil à ce modèle de composant:Ici, p_Dir est une directive sur l'
<p>
élément. Lorsque@HostBinding
ou@HostListener
est utilisé dans la classe de directive, l'hôte fera désormais référence au<p>
.la source
Théorie avec moins de jargons
@Hostlistnening traite essentiellement de l'élément hôte, disons (un bouton), écoutant une action d'un utilisateur et exécutant une certaine fonction, disons alert ("Ahoy!"), Tandis que @Hostbinding est l'inverse. Ici, nous écoutons les changements qui se sont produits sur ce bouton en interne (dites quand on a cliqué sur ce qui est arrivé à la classe) et nous utilisons ce changement pour faire autre chose, par exemple émettre une couleur particulière.
Exemple
Pensez au scénario dans lequel vous souhaitez créer une icône préférée sur un composant, maintenant vous savez que vous devez savoir si l'élément a été ajouté aux favoris avec sa classe modifiée, nous avons besoin d'un moyen de le déterminer. C'est exactement là qu'intervient @Hostbinding.
Et là où il est nécessaire de savoir quelle action a réellement été effectuée par l'utilisateur, c'est là qu'intervient @Hostlistening
la source