Содержание

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()'
}