@HostBinding et @HostListener: que font-ils et à quoi servent-ils?
dans Mes méandres autour de l'interweb mondial, et maintenant surtout l'angle .io style docs , je trouve de nombreuses références à @HostBinding
et @HostListener
. Il semble qu'elles soient assez fondamentales, mais malheureusement la documentation dont elles disposent actuellement est un peu sommaire.
quelqu'un Peut-il expliquer ce qu'ils sont, comment ils fonctionnent et donner un exemple de leur utilisation?
6 réponses
avez-vous vérifié ces documents officiels?
HostListener - déclare un auditeur hôte.Angulaire appeler le décoré de la méthode lorsque l'élément hôte émet l'événement spécifié.
#
HostListener - écoutera l'événement émis par l'élément hôte, a déclaré @HostListener.
HostBinding - déclare une propriété hôte liant.Anguleux vérifie automatiquement les fixations des propriétés de l'hôte pendant la détection des modifications. Si une clause contraignante change, elle mettra à jour l'élément host de la directive.
#
HostBinding - va lier la propriété à l'élément hôte, si une liaison change, HostBinding mettra à jour l'élément hôte.
NOTE: les deux liens ont été supprimés récemment.Donc,s'il vous plaît essayer de le comprendre de HostBinding-HostListening comme aucune documentation appropriée n'est encore disponible.
j'ai essayé de faire un exemple simple pour votre meilleure compréhension,
cet exemple lie un role property
déclaré avec @HostBinding
à host element<p>
et écoute le click event
déclaré avec @HostListener
du host element <p>
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>
I'm(HostListener) listening to host's <b>click event</b> declared with @HostListener
<br><br>
I'm(HostBinding) binding <b>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> Open DOM of host element, click host element(in UI) and check role attribute(in 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 la même que [value]="myValue"
et
HostListener('click') myClick(){ }
est exactement le même que (click)="myClick()"
HostBinding
et HostListener
sont écrits dans les directives
et les autres (...)
et [..]
sont écrits à l'intérieur de modèles (de composants).
voici un exemple de vol stationnaire de base.
propriété de modèle de Component:
Modèle
<!-- attention, we have the c_highlight class -->
<!-- c_highlight is the selector property value of the directive -->
<p class="c_highlight">
Some text.
</p>
et notre directive
import {Component,HostListener,Directive,HostBinding} from '@angular/core';
@Directive({
// this directive will work only if the DOM el has the c_highlight class
selector: '.c_highlight'
})
export class HostDirective {
// we could pass lots of thing to the HostBinding function.
// like class.valid or attr.required etc.
@HostBinding('style.backgroundColor') c_colorrr = "red";
@HostListener('mouseenter') c_onEnterrr() {
this.c_colorrr= "blue" ;
}
@HostListener('mouseleave') c_onLeaveee() {
this.c_colorrr = "yellow" ;
}
}
une autre bonne chose à propos de @HostBinding
est que vous pouvez le combiner avec @Input
si votre liaison repose directement sur une entrée, par exemple:
@HostBinding('class.fixed-thing')
@Input()
fixed: boolean;
une chose qui ajoute de la confusion à ce sujet est l'idée de décorateurs n'est pas très clair, et quand nous considérons quelque chose comme...
@HostBinding('attr.something')
get something() {
return this.somethingElse;
}
Il fonctionne, parce que c'est un get
accesseur . Vous ne pouvez pas utiliser une fonction équivalente:
@HostBinding('attr.something')
something() {
return this.somethingElse;
}
sinon, l'avantage d'utiliser @HostBinding
est d'assurer que la détection de changement est exécutée lorsque la valeur liée change.
"151910920 la Théorie de la" avec moins de Jargon
@Hostlistnening traite essentiellement de l'élément host say (un bouton) écoutant une action d'un utilisateur et exécutant une certaine fonction say alert ("Ohé!") alors que @Hostbinding est l'inverse. Ici, nous écoutons les changements qui se sont produits sur ce bouton en interne (dire quand il a été cliqué ce qui est arrivé à la classe) et nous utilisons ce changement pour faire quelque chose d'autre, disons émettre une couleur particulière.
exemple
pensez au scénario que vous voudriez faire une icône préférée sur un composant, maintenant vous savez que vous auriez à savoir si l'article a été favorisé avec sa classe changée, nous avons besoin d'un moyen de déterminer cela. C'est exactement là que @Hostbinding entre en jeu.
et là où il y a le besoin de savoir quelle action a été réellement effectuée par l'utilisateur qui est là où @Hostlistening vient en