From 4cda0f3404bbb8de4cc9d07fa6dae19af9f7fa78 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 27 Nov 2018 22:05:47 +0100 Subject: [PATCH] fix(cdk-experimental/dialog): not completing lifecycle observables (#14180) Fixes the CDK dialog not completing the various one-time observables that are tied to its lifecycle. --- .../dialog/dialog-container.ts | 4 ++++ src/cdk-experimental/dialog/dialog.spec.ts | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/cdk-experimental/dialog/dialog-container.ts b/src/cdk-experimental/dialog/dialog-container.ts index c7ca506f803..1139cf7ad30 100644 --- a/src/cdk-experimental/dialog/dialog-container.ts +++ b/src/cdk-experimental/dialog/dialog-container.ts @@ -133,11 +133,13 @@ export class CdkDialogContainer extends BasePortalOutlet implements OnDestroy { if (event.toState === 'enter') { this._autoFocusFirstTabbableElement(); this._afterEnter.next(); + this._afterEnter.complete(); } if (event.fromState === 'enter' && (event.toState === 'void' || event.toState === 'exit')) { this._returnFocusAfterDialog(); this._afterExit.next(); + this._afterExit.complete(); } }); } @@ -178,9 +180,11 @@ export class CdkDialogContainer extends BasePortalOutlet implements OnDestroy { _onAnimationStart(event: AnimationEvent) { if (event.toState === 'enter') { this._beforeEnter.next(); + this._beforeEnter.complete(); } if (event.fromState === 'enter' && (event.toState === 'void' || event.toState === 'exit')) { this._beforeExit.next(); + this._beforeExit.complete(); } } diff --git a/src/cdk-experimental/dialog/dialog.spec.ts b/src/cdk-experimental/dialog/dialog.spec.ts index bc8fbf72603..ac6040ef6fe 100644 --- a/src/cdk-experimental/dialog/dialog.spec.ts +++ b/src/cdk-experimental/dialog/dialog.spec.ts @@ -632,6 +632,29 @@ describe('Dialog', () => { expect(overlayContainerElement.querySelectorAll('cdk-dialog-container').length).toBe(0); })); + it('should complete the various lifecycle streams on destroy', fakeAsync(() => { + let dialogRef = dialog.openFromComponent(PizzaMsg, { viewContainerRef: testViewContainerRef }); + let beforeOpenedComplete = jasmine.createSpy('before opened complete spy'); + let afterOpenedComplete = jasmine.createSpy('after opened complete spy'); + let beforeClosedComplete = jasmine.createSpy('before closed complete spy'); + let afterClosedComplete = jasmine.createSpy('after closed complete spy'); + + viewContainerFixture.detectChanges(); + dialogRef.beforeOpened().subscribe({complete: beforeOpenedComplete}); + dialogRef.afterOpened().subscribe({complete: afterOpenedComplete}); + dialogRef.beforeClosed().subscribe({complete: beforeClosedComplete}); + dialogRef.afterClosed().subscribe({complete: afterClosedComplete}); + + dialogRef.close('Charmander'); + viewContainerFixture.detectChanges(); + flush(); + + expect(beforeOpenedComplete).toHaveBeenCalled(); + expect(afterOpenedComplete).toHaveBeenCalled(); + expect(beforeClosedComplete).toHaveBeenCalled(); + expect(afterClosedComplete).toHaveBeenCalled(); + })); + describe('passing in data', () => { it('should be able to pass in data', () => { let config = {