Skip to content

Commit 4cda0f3

Browse files
crisbetojelbourn
authored andcommitted
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.
1 parent 2540b82 commit 4cda0f3

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/cdk-experimental/dialog/dialog-container.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,13 @@ export class CdkDialogContainer extends BasePortalOutlet implements OnDestroy {
133133
if (event.toState === 'enter') {
134134
this._autoFocusFirstTabbableElement();
135135
this._afterEnter.next();
136+
this._afterEnter.complete();
136137
}
137138

138139
if (event.fromState === 'enter' && (event.toState === 'void' || event.toState === 'exit')) {
139140
this._returnFocusAfterDialog();
140141
this._afterExit.next();
142+
this._afterExit.complete();
141143
}
142144
});
143145
}
@@ -178,9 +180,11 @@ export class CdkDialogContainer extends BasePortalOutlet implements OnDestroy {
178180
_onAnimationStart(event: AnimationEvent) {
179181
if (event.toState === 'enter') {
180182
this._beforeEnter.next();
183+
this._beforeEnter.complete();
181184
}
182185
if (event.fromState === 'enter' && (event.toState === 'void' || event.toState === 'exit')) {
183186
this._beforeExit.next();
187+
this._beforeExit.complete();
184188
}
185189
}
186190

src/cdk-experimental/dialog/dialog.spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,29 @@ describe('Dialog', () => {
632632
expect(overlayContainerElement.querySelectorAll('cdk-dialog-container').length).toBe(0);
633633
}));
634634

635+
it('should complete the various lifecycle streams on destroy', fakeAsync(() => {
636+
let dialogRef = dialog.openFromComponent(PizzaMsg, { viewContainerRef: testViewContainerRef });
637+
let beforeOpenedComplete = jasmine.createSpy('before opened complete spy');
638+
let afterOpenedComplete = jasmine.createSpy('after opened complete spy');
639+
let beforeClosedComplete = jasmine.createSpy('before closed complete spy');
640+
let afterClosedComplete = jasmine.createSpy('after closed complete spy');
641+
642+
viewContainerFixture.detectChanges();
643+
dialogRef.beforeOpened().subscribe({complete: beforeOpenedComplete});
644+
dialogRef.afterOpened().subscribe({complete: afterOpenedComplete});
645+
dialogRef.beforeClosed().subscribe({complete: beforeClosedComplete});
646+
dialogRef.afterClosed().subscribe({complete: afterClosedComplete});
647+
648+
dialogRef.close('Charmander');
649+
viewContainerFixture.detectChanges();
650+
flush();
651+
652+
expect(beforeOpenedComplete).toHaveBeenCalled();
653+
expect(afterOpenedComplete).toHaveBeenCalled();
654+
expect(beforeClosedComplete).toHaveBeenCalled();
655+
expect(afterClosedComplete).toHaveBeenCalled();
656+
}));
657+
635658
describe('passing in data', () => {
636659
it('should be able to pass in data', () => {
637660
let config = {

0 commit comments

Comments
 (0)