Вы проверили эти официальные документы?
HostListener - объявляет хост-слушатель. Angular будет вызывать оформленный метод, когда хост-элемент генерирует указанное событие.
@HostListener
- будет прослушивать событие, генерируемое элементом host, объявленным с @HostListener
.
HostBinding - объявляет привязку свойства хоста. Angular автоматически проверяет привязки свойств хоста во время обнаружения изменений. Если привязка изменится, она обновит хост-элемент директивы.
@HostBinding
- свяжет свойство с элементом host. Если привязка изменится, HostBinding
обновит элемент host.
ПРИМЕЧАНИЕ. Обе ссылки были недавно удалены. Часть " HostBinding-HostListening " руководства по стилю может быть полезной альтернативой, пока ссылки не вернутся.
Вот простой пример кода, чтобы помочь понять, что это значит:
ДЕМО: Вот демо-версия live in plunker - «Простой пример @HostListener & @HostBinding»
- В этом примере привязывается
role
свойство - объявлено с @HostBinding
- к элементу хоста
- Напомним, что
role
это атрибут, так как мы используем attr.role
.
<p myDir>
становится, <p mydir="" role="admin">
когда вы просматриваете его в инструментах разработчика.
- Затем он прослушивает
onClick
событие, объявленное с помощью @HostListener
, прикрепленного к элементу хоста компонента, и изменяется role
с каждым щелчком.
- Изменение при
<p myDir>
нажатии заключается в том, что его открывающий тег изменяется с <p mydir="" role="admin">
на <p mydir="" role="guest">
и обратно.
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>
We have a (HostListener) listening to this host's <b>click event</b> declared with @HostListener
<br><br>
And we have a (HostBinding) binding <b>the 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>View this change in the DOM of the host element by opening developer tools,
clicking the host element in the UI.
The role attribute's changes will be visible in the DOM.</div>
`,
directives: [HostDirective]
})
export class AppComponent {}
Быстрый совет, который помогает мне вспомнить, что они делают -
HostBinding('value') myValue;
точно так же, как[value]="myValue"
И
HostListener('click') myClick(){ }
точно так же, как(click)="myClick()"
HostBinding
иHostListener
написаны в директивах и других(...)
и[..]
написаны внутри шаблонов (компонентов).источник
@HostListener
это путь, когда у вас нет ничего в DOM для типичной привязки событий, таких как ввод с клавиатуры в моем случае.Вот основной пример парения.
Свойство шаблона компонента:
шаблон
И наша директива
источник
Еще одна приятная вещь в
@HostBinding
том, что вы можете комбинировать это,@Input
если ваша привязка опирается непосредственно на вход, например:источник
@Input()
?@HostBinding
. Когда вам нужно использовать@Input
?Одна вещь, которая добавляет путаницу к этой теме, что идея декораторов не очень понятна, и когда мы рассматриваем что-то вроде ...
Это работает, потому что это
get
аксессор . Вы не можете использовать эквивалент функции:В противном случае преимущество использования
@HostBinding
заключается в том, что он обеспечивает обнаружение изменений при изменении связанного значения.источник
Резюме:
@HostBinding
: Этот декоратор связывает свойство класса со свойством элемента host.@HostListener
: Этот декоратор связывает метод класса с событием элемента хоста.Пример:
В приведенном выше примере происходит следующее:
color
Свойство в нашемAppComponent
классе привязывается кstyle.color
собственности на компоненте. Поэтому, когдаcolor
свойство обновляется,style.color
свойство нашего компонента такжеИспользование в
@Directive
:Хотя это может использоваться в компоненте, эти декораторы часто используются в директивах атрибута. При использовании в
@Directive
хосте изменяется элемент, на котором размещена директива. Например, взгляните на этот шаблон компонента:Здесь p_Dir - это директива для
<p>
элемента. Когда@HostBinding
или@HostListener
используется в классе директивы, хост теперь будет ссылаться на<p>
.источник
Теория с меньшим количеством жаргонов
@Hostlistnening в основном имеет дело с элементом host, скажем (кнопка), слушающим действие пользователя и выполняющим определенную функцию, например alert («Ahoy!»), В то время как @Hostbinding наоборот. Здесь мы слушаем изменения, которые произошли внутри этой кнопки (скажем, когда она была нажата, что случилось с классом), и мы используем это изменение, чтобы сделать что-то еще, скажем, испустить определенный цвет.
пример
Подумайте о сценарии, в котором вы хотели бы сделать любимую иконку для компонента, теперь вы знаете, что вам нужно знать, был ли элемент избран с измененным классом, нам нужен способ определить это. Именно здесь приходит @Hostbinding.
И там, где необходимо знать, какое действие на самом деле было выполнено пользователем, в которое входит @Hostlistening
источник