@HostBinding и @HostListener: что они делают и для чего?

в моих блужданиях по всемирной паутине, а теперь особенно угловой.IO style docs, Я нахожу много ссылок на @HostBinding и @HostListener. Кажется, они довольно фундаментальны, но, к сожалению, документация для них на данный момент немного отрывочна.

может ли кто-нибудь объяснить, что они такое, как они работают и привести пример их использования?

6 ответов


вы проверили эти официальные документы?

HostListener - объявляет ведущий слушатель.Angular вызовет метод decorated, когда элемент host испускает указанное событие.
# HostListener - будет прослушивать событие, испускаемое элементом host, объявленным с помощью @HostListener.

HostBinding - объявляет привязку свойства узла.Angular автоматически проверяет привязки свойств хоста во время обнаружения изменений. Если привязка изменяется, она обновит элемент host директивы.
# HostBinding - будет привязывать свойство к элементу хоста, если привязка изменится, HostBinding обновит элемент хоста.


Примечание: обе ссылки были удалены недавно.Поэтому, пожалуйста, попытайтесь понять это из HostBinding-HostListening поскольку пока нет надлежащей документации.

я постарался сделать простой пример для лучшего понимание,

демо : Проверьте ниже пример live in plunker-простой пример о @HostListener & @HostBinding

этот пример связывает role property объявлена с @HostBinding to host element<p> и слушает click event объявлена с @HostListener на host element <p>

директивы.ТС

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.ТС

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 {}

Быстрый совет, который поможет мне вспомнить, что они делают -

HostBinding('value') myValue; Это то же самое, что [value]="myValue"

и

HostListener('click') myClick(){ } точно так же, как (click)="myClick()"


HostBinding и HostListener написано в директивы а остальные! .. --6--> и [..] записываются внутри шаблонов (компонентов).


вот простой пример наведения.

свойство шаблона компонента:

шаблон

<!-- attention, we have the c_highlight class -->
<!-- c_highlight is the selector property value of the directive -->

<p class="c_highlight">
    Some text.
</p>

и наша директива

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" ;
  } 
}

еще одна хорошая вещь о @HostBinding это то, что вы можете объединить его с @Input Если ваша привязка зависит непосредственно от ввода, например:

@HostBinding('class.fixed-thing')
@Input()
fixed: boolean;

одна вещь, которая добавляет путаницы в эту тему, - идея декораторов не очень ясна, и когда мы рассматриваем что-то подобное...

@HostBinding('attr.something') 
get something() { 
    return this.somethingElse; 
 }

это работает, потому что это get accessor. Вы не можете использовать эквивалент функции:

@HostBinding('attr.something') 
something() { 
    return this.somethingElse; 
 }

в противном случае, выгода от использования @HostBinding это гарантирует, что обнаружение изменений выполняется при изменении связанного значения.


теория с меньшим количеством жаргонов

@Hostlistnening имеет дело в основном с элементом host say (кнопка) прослушивание действия пользователя и выполнение определенной функции say alert("Ahoy!") а @Hostbinding наоборот. Здесь мы слушаем изменения, которые произошли на этой кнопке внутри (скажем, когда она была нажата, что случилось с классом), и мы используем это изменение, чтобы сделать что-то еще, скажем, испустить определенный цвет.

пример

подумайте о сценарии, который вы хотели бы сделать любимым значком на компоненте, теперь вы знаете, что вам нужно знать, был ли элемент выбран с его классом изменен, нам нужен способ определить это. Именно там появляется @Hostbinding.

и где есть необходимость знать, какое действие на самом деле было выполнено пользователем, где @Hostlistening входит