Skip to content

Instantly share code, notes, and snippets.

@alxpsr
Created October 19, 2017 06:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alxpsr/0bafe7d4fd075cda7ccbf82d9950471d to your computer and use it in GitHub Desktop.
Save alxpsr/0bafe7d4fd075cda7ccbf82d9950471d to your computer and use it in GitHub Desktop.
click-outside
constructor(private elementRef: ElementRef, private ngbPopover: NgbPopover,
private ngZone: NgZone, private cd: ChangeDetectorRef, private renderer: Renderer2) {
}
ngOnInit() {
this.ngZone.runOutsideAngular(() => {
this.listener = this.renderer.listen('document', 'click', (event) => {
this.closePopoverOnClickOutside(event);
});
});
}
ngOnDestroy() {
this.listener();
}
private closePopoverOnClickOutside(event: MouseEvent): void {
// Popover is open
if (this.ngbPopover && this.ngbPopover.isOpen()) {
// Not clicked on self element
if (!this.elementRef.nativeElement.contains(event.target)) {
// Hacking typescript to access private member
const popoverWindowRef: ComponentRef<NgbPopoverWindow> = (this.ngbPopover as any)._windowRef;
// If clicked outside popover window
if (!popoverWindowRef.location.nativeElement.contains(event.target)) {
this.ngbPopover.close();
this.cd.detectChanges(); // detect changes
}
}
}
}
@alxpsr
Copy link
Author

alxpsr commented Oct 19, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment