Skip to main content
  1. Tutorials/

How To Use @HostBinding and @HostListener in Custom Angular Directives

Tutorials Angular
Introduction>

Introduction #

@HostBinding and @HostListener are two decorators in Angular that can be really useful in custom directives. @HostBinding lets you set properties on the element or component that hosts the directive, and @HostListener lets you listen for events on the host element or component.
In this article, you will use @HostBinding and @HostListener in an example directive that listens for a keydown event on the host.

It will set its text and border color to a random color from a set of a few available colors.

Prerequisites>

Prerequisites #

To complete this tutorial, you will need:

Node.js installed locally, which you can do by following How to Install Node.js and Create a Local Development Environment.
Some familiarity with setting up an Angular project and using Angular components may be beneficial.

This tutorial was verified with Node v16.4.2, npm v7.18.1, angular v12.1.1.

Using @HostBinding and @HostListener>

Using @HostBinding and @HostListener #

First, create a new RainbowDirective.
This can be accomplished with @angular/cli:

ng generate directive rainbow --skip-tests

This will add the new component to the app declarations and produce a rainbow.directive.ts file:
src/app/rainbow.directive.ts

import { Directive } from '@angular/core';

@Directive({
  selector: '[appRainbow]'
})
export class RainbowDirective {

  constructor() { }

}

Add @HostBinding and @HostListener:
src/app/rainbow.directive.ts

import { Directive, HostBinding, HostListener } from '@angular/core';

@Directive({
  selector: '[appRainbow]'
})
export class RainbowDirective {

  possibleColors = [
    'darksalmon',
    'hotpink',
    'lightskyblue',
    'goldenrod',
    'peachpuff',
    'mediumspringgreen',
    'cornflowerblue',
    'blanchedalmond',
    'lightslategrey'
  ];

  @HostBinding('style.color') color!: string;
  @HostBinding('style.border-color') borderColor!: string;

  @HostListener('keydown') newColor() {
    const colorPick = Math.floor(Math.random() * this.possibleColors.length);

    this.color = this.borderColor = this.possibleColors[colorPick];
  }

}

And the directive can be used on elements like this:
src/app/app.component.html

<input type="text" appRainbow />

Our Rainbow directive uses two @HostBinding decorators to define two class members, one that’s attached to the host’s style.color binding and the other to style.border-color.
You can also bind to any class, property, or attribute of the host.
Here are a few more examples of possible bindings:

@HostBinding('class.active')
@HostBinding('disabled')
@HostBinding('attr.role')

The @HostListener with the 'keydown' argument listens for the keydown event on the host. We define a function attached to this decorator that changes the value of color and borderColor, and our changes get reflected on the host automatically.

Conclusion>

Conclusion #

In this article, you used @HostBinding and @HostListener in an example directive that listens for a keydown event on the host.
If you’d like to learn more about Angular, check out our Angular topic page for exercises and programming projects.