Skip to content

Commit e752d19

Browse files
committed
fix(popover-edit): focus trap not being destroyed and potential leaks with takeUntil
* Fixes the focus trap associated with a popover edit not being cleaned up. * Fixes potential memory leaks in the way `takeUntil` was being used. See https://blog.angularindepth.com/rxjs-avoiding-takeuntil-leaks-fb5182d047ef.
1 parent f8be532 commit e752d19

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/cdk-experimental/popover-edit/table-directives.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,30 +76,29 @@ export class CdkEditable implements AfterViewInit, OnDestroy {
7676
}
7777

7878
private _listenForTableEvents(): void {
79-
const element = this.elementRef.nativeElement!;
80-
79+
const element = this.elementRef.nativeElement;
8180
const toClosest = (selector: string) =>
8281
map((event: UIEvent) => closest(event.target, selector));
8382

8483
this.ngZone.runOutsideAngular(() => {
8584
fromEvent<MouseEvent>(element, 'mouseover').pipe(
86-
takeUntil(this.destroyed),
8785
toClosest(ROW_SELECTOR),
86+
takeUntil(this.destroyed),
8887
).subscribe(this.editEventDispatcher.hovering);
8988
fromEvent<MouseEvent>(element, 'mouseleave').pipe(
90-
takeUntil(this.destroyed),
9189
mapTo(null),
90+
takeUntil(this.destroyed),
9291
).subscribe(this.editEventDispatcher.hovering);
9392
fromEvent<MouseEvent>(element, 'mousemove').pipe(
94-
takeUntil(this.destroyed),
9593
debounceTime(DEFAULT_MOUSE_MOVE_DELAY_MS),
9694
toClosest(ROW_SELECTOR),
95+
takeUntil(this.destroyed),
9796
).subscribe(this.editEventDispatcher.mouseMove);
9897

9998
fromEvent<KeyboardEvent>(element, 'keyup').pipe(
100-
takeUntil(this.destroyed),
10199
filter(event => event.key === 'Enter'),
102100
toClosest(CELL_SELECTOR),
101+
takeUntil(this.destroyed),
103102
).subscribe(this.editEventDispatcher.editing);
104103

105104
// Keydown must be used here or else key autorepeat does not work properly on some platforms.
@@ -179,6 +178,11 @@ export class CdkPopoverEdit<C> implements AfterViewInit, OnDestroy {
179178
this.destroyed.next();
180179
this.destroyed.complete();
181180

181+
if (this.focusTrap) {
182+
this.focusTrap.destroy();
183+
this.focusTrap = undefined;
184+
}
185+
182186
if (this.overlayRef) {
183187
this.overlayRef.dispose();
184188
}

0 commit comments

Comments
 (0)