=====HostListener и HostBinding=====
Кроме простой установки значений атрибутивная директива может взаимодействовать с пользователем. Для этого применяется декоратор HostListener.\\
\\
Так, возьмем директиву //BoldDirective// из прошлой темы и добавим в нее взаимодействие с пользователем:
import {Directive, ElementRef, Renderer2, HostListener} from '@angular/core';
@Directive({
selector: '[bold]'
})
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);
}
}
Декоратор **@HostListener** позволяет связать события DOM и методы директивы. В частности, в декоратор передается название события, по которому будет вызываться метод. В данном случае мы привязываем события mouseenter (наведения указателя мыши на элемент) и mouseleave (уведение указателя мыши с элемента) к методу setFontWeight(), который устанавливает стилевое свойство font-weight у элемента. Если мы наводим на элемент, то устанавливается выделение жирным. При отводе мыши выделение сбрасывается.\\
\\
Кроме кода директивы менять больше ничего не надо, код компонента и модуля остаются теми же.
====HostBinding====
Еще один декоратор - **HostBinding** позволяет связать обычное свойство класса со свойством элемента, к которому применяется директива. Например, изменим код директивы следующим образом:
import {Directive, HostListener, HostBinding} from '@angular/core';
@Directive({
selector: '[bold]'
})
export class BoldDirective{
private fontWeight = "normal";
//Первый вариант
@HostBinding("style.fontWeight") get getFontWeight(){
return this.fontWeight;
}
//Второй вариант
@HostBinding('style.cursor') cursor: string = '';
@HostListener("mouseenter") onMouseEnter() {
this.fontWeight ="bold";
this.cursor = "pointer";
}
@HostListener("mouseleave") onMouseLeave() {
this.fontWeight = "normal";
}
}
Инструкция @HostBinding("style.fontWeight") get getFontWeight() связывает со свойством "style.fontWeight" значение, которое возвращается этим геттером getFontWeight. А он возвращает значение свойства fontWeight, которое также меняется при наведении указателя мыши.
====Свойство host====
Вместо применения декораторов HostListener и HostBinding для реагирования директивы на действия пользователя мы можем определить обработчики событий в декораторе Directive с помощью его свойства host. Так, перепишем директиву следующим образом:
import {Directive, ElementRef, Renderer2} from '@angular/core';
@Directive({
selector: '[bold]',
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);
}
}
Результат работы директивы в данном случае будет аналогичен, только теперь все события и связанные с ними обработчики определяются с помощью параметра host:
host: {
'(mouseenter)': 'onMouseEnter()',
'(mouseleave)': 'onMouseLeave()'
}