Approach:
- Angular directive needs to listen for click events on the entire document.
- Then check if the clicked element is within its host element or not.
click-outside.directive.ts
Let's break down the code:
@Directive({ selector: '[appClickOutside]' }):
This means you'll apply the directive to an HTML element like this: <div appClickOutside>...</div>
@HostListener('document:click', ['$event.target']):
This tells Angular to listen for the click
event on the entire document object, not just the host element itself. This is crucial for detecting clicks outside.
['$event.target']:
This tells Angular to pass the target property of the click event (which is the actual DOM element that was clicked) as an argument to our onClick
method.
const clickedInside = this.elementRef.nativeElement.contains(targetElement);
: This line uses the contains()
method of the DOM Node interface. It checks if the targetElement
(the element that was clicked) is a descendant of the directive's host element (this.elementRef.nativeElement
).
How to Use It:
Define in module:
// src/app/app.module.ts import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; import { ClickOutsideDirective } from './click-outside.directive'; // Import your directive @NgModule({ declarations: [ AppComponent, ClickOutsideDirective // <--- Declare your directive ], imports: [ BrowserModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
component.html
<div style="border: 2px solid blue; padding: 20px; margin: 50px;" appClickOutside <-- THIS IS WHERE THE DIRECTIVE IS APPLIED --> clickOutside)="onClickedOutside()"> <-- THIS IS WHERE THE COMPONENT LISTENS TO THE DIRECTIVE'S OUTPUT --> This is the host element. Click anywhere outside this blue box! <button (click)="onButtonClick($event)">Click Me (Inside)</button> </div> <p *ngIf="message">{{ message }}</p>
Handling event on click in component.ts
import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { message: string = ''; onClickedOutside(): void { this.message = 'Clicked outside the box!'; console.log('Clicked outside the element!'); } onButtonClick(event: Event): void { event.stopPropagation(); // Prevent the document click listener from firing immediately this.message = 'Button inside clicked!'; console.log('Button inside clicked!'); } }
📌📌 More angular learnings here:
RXJS and Angular Bonding
Angular HTTP integration
XSS Attack and Angular Handling
Top comments (0)