Interagindo com o usuário: HostListener e HostBinding - Angular
Além de simplesmente definir valores, uma diretiva de atributo pode interagir com o usuário. Para isso, utiliza-se o decorador HostListener
Por exemplo, suponha que no arquivo bold.directive.ts está definida a diretiva BoldDirective
helloapp/ ├── src/ │ ├── app/ │ │ ├── app.component.ts │ │ ├── bold.directive.ts │ ├── main.ts │ ├── index.html ├── angular.json ├── package-lock.json ├── package.json └── tsconfig.json
Vamos supor que essa diretiva contém o seguinte código de interação com o usuário:
import { Directive, ElementRef, Renderer2, HostListener } from "@angular/core";
@Directive({
selector: "[bold]",
standalone: true
})
export class BoldDirective {
constructor(private element: ElementRef, private renderer: Renderer2) {
this.renderer.setStyle(this.element.nativeElement, "cursor", "pointer");
}
@HostListener("mouseenter") onMouseEnter() {
this.setFontWeight("bold");
}
@HostListener("mouseleave") onMouseLeave() {
this.setFontWeight("normal");
}
private setFontWeight(val: string) {
this.renderer.setStyle(this.element.nativeElement, "font-weight", val);
}
}
O decorador @HostListener
mouseenter
mouseleave
setFontWeight()
font-weight
O código do componente que utiliza a diretiva pode ser o seguinte:
import { Component } from "@angular/core";
import { BoldDirective } from "./bold.directive";
@Component({
selector: "my-app",
standalone: true,
imports: [BoldDirective],
template: `<div>
<p bold>Hello Angular</p>
<p>Aplicação Angular consiste em componentes</p>
</div>`
})
export class AppComponent { }
HostBinding
Outro decorador, o HostBinding
import { Directive, HostListener, HostBinding } from "@angular/core";
@Directive({
selector: "[bold]",
standalone: true
})
export class BoldDirective {
private fontWeight = "normal";
@HostBinding("style.fontWeight") get getFontWeight() {
return this.fontWeight;
}
@HostBinding("style.cursor") get getCursor() {
return "pointer";
}
@HostListener("mouseenter") onMouseEnter() {
this.fontWeight = "bold";
}
@HostListener("mouseleave") onMouseLeave() {
this.fontWeight = "normal";
}
}
A instrução @HostBinding("style.fontWeight") get getFontWeight()
style.fontWeight
getFontWeight
fontWeight
Propriedade host
Em vez de utilizar os decoradores HostListener
HostBinding
Directive
host
import { Directive, ElementRef, Renderer2 } from "@angular/core";
@Directive({
selector: "[bold]",
standalone: true,
host: {
"(mouseenter)": "onMouseEnter()",
"(mouseleave)": "onMouseLeave()"
}
})
export class BoldDirective {
constructor(private element: ElementRef, private renderer: Renderer2) {
this.renderer.setStyle(this.element.nativeElement, "cursor", "pointer");
}
onMouseEnter() {
this.setFontWeight("bold");
}
onMouseLeave() {
this.setFontWeight("normal");
}
private setFontWeight(val: string) {
this.renderer.setStyle(this.element.nativeElement, "font-weight", val);
}
}
O resultado da diretiva nesse caso será o mesmo, mas agora todos os eventos e seus respectivos manipuladores são definidos usando o parâmetro host
host: {
"(mouseenter)": "onMouseEnter()",
"(mouseleave)": "onMouseLeave()"
}
Essa abordagem oferece uma alternativa mais concisa para definir o comportamento de eventos diretamente na definição da diretiva.