mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
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:
committed by
Jeremy Elbourn
parent
2540b82462
commit
4cda0f3404
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user