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.
This commit is contained in:
Kristiyan Kostadinov
2018-11-27 22:05:47 +01:00
committed by Jeremy Elbourn
parent 2540b82462
commit 4cda0f3404
2 changed files with 27 additions and 0 deletions
@@ -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();
}
}
@@ -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 = {