In Angular2, how can I target an element within the HostListener decorator?
@HostListener('dragstart', ['$event']) onDragStart(ev:Event) { console.log(ev); } @HostListener('document: dragstart', ['$event']) onDragStart(ev:Event) { console.log(ev); } @HostListener('myElement: dragstart', ['$event']) onDragStart(ev:Event) { console.log(ev); } @HostListener('myElement.myClass: dragstart', ['$event']) onDragStart(ev:Event) { console.log(ev); }
The two first work. Any other thing I've tried raises an EXCEPTION: Unsupported event target undefined for event dragstart
So, can I implement it to a targeted element? How?
@HostListener is Angular's decorator method that's used for listening to DOM events on the host element of both component and attribute directives.
HostListenerlink Decorator that declares a DOM event to listen for, and provides a handler method to run when that event occurs.
HostBindinglinkDecorator that marks a DOM property as a host-binding property and supplies configuration metadata. Angular automatically checks host property bindings during change detection, and if a binding changes it updates the host element of the directive.
@HostListener()
only supports window
, document
, and body
as global event targets, otherwise it only supports the components host element.
Since the accepted answer doesn't actually help to solve the problem, here is a solution.
A better way to achieve this is by creating a directive, this way you can add the directive to any element you wish, and the listeners will only trigger for this particular element.
For example:
@Directive({ selector: "[focus-out-directive]" }) export class FocusOutDirective { @Output() onFocusOut: EventEmitter<boolean> = new EventEmitter<false>(); @HostListener("focusout", ["$event"]) public onListenerTriggered(event: any): void { this.onFocusOut.emit(true); } }
Then on your HTML elements you wish to apply this listener to, just add the directive selector, in this case focus-out-directive
, and then supply the function you wish to trigger on your component.
Example:
<input type='text' focus-out-directive (onFocusOut)='myFunction($event)'/>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With