From b72bd2735da5d07713b6895db2842d132f62e131 Mon Sep 17 00:00:00 2001 From: Artur Androsovych Date: Tue, 22 Feb 2022 04:16:39 +0200 Subject: [PATCH] perf(module:mention): do not run change detection when the dropdown cannot be closed (#7146) --- components/mention/mention.component.ts | 29 +++++++++++++++++-------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/components/mention/mention.component.ts b/components/mention/mention.component.ts index b894ecb0cf..5569f32aca 100644 --- a/components/mention/mention.component.ts +++ b/components/mention/mention.component.ts @@ -381,19 +381,30 @@ export class NzMentionComponent implements OnDestroy, OnInit, AfterViewInit, OnC } private subscribeOverlayOutsideClick(): Subscription { - return merge( - this.overlayRef!.outsidePointerEvents(), - fromEvent(this.ngDocument, 'touchend') - ).subscribe((event: MouseEvent | TouchEvent) => { + const canCloseDropdown = (event: MouseEvent | TouchEvent): boolean => { const clickTarget = event.target as HTMLElement; - if ( + return ( this.isOpen && clickTarget !== this.trigger.el.nativeElement && !this.overlayRef?.overlayElement.contains(clickTarget) - ) { - this.closeDropdown(); - } - }); + ); + }; + + const subscription = new Subscription(); + + subscription.add( + this.overlayRef!.outsidePointerEvents().subscribe(event => canCloseDropdown(event) && this.closeDropdown()) + ); + + subscription.add( + this.ngZone.runOutsideAngular(() => + fromEvent(this.ngDocument, 'touchend').subscribe( + event => canCloseDropdown(event) && this.ngZone.run(() => this.closeDropdown()) + ) + ) + ); + + return subscription; } private attachOverlay(): void {