Skip to content

Commit c68ea6e

Browse files
committed
fix(dialog): backdrop not being removed if it doesn't have transitions
Fixes the dialog's backdrop not being removed if it's transition have been disabled. Fixes #1607.
1 parent 547a75d commit c68ea6e

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

src/lib/core/overlay/overlay-ref.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ export class OverlayRef implements PortalHost {
9292

9393
// Add class to fade-in the backdrop after one frame.
9494
requestAnimationFrame(() => {
95-
this._backdropElement.classList.add('md-overlay-backdrop-showing');
95+
if (this._backdropElement) {
96+
this._backdropElement.classList.add('md-overlay-backdrop-showing');
97+
}
9698
});
9799
}
98100

@@ -101,18 +103,29 @@ export class OverlayRef implements PortalHost {
101103
let backdropToDetach = this._backdropElement;
102104

103105
if (backdropToDetach) {
106+
let onTransitionEnd = () => {
107+
if (backdropToDetach) {
108+
if (backdropToDetach.parentNode) {
109+
backdropToDetach.parentNode.removeChild(backdropToDetach);
110+
}
111+
112+
// It is possible that a new portal has been attached to this overlay since we started
113+
// removing the backdrop. If that is the case, only clear the backdrop reference if it
114+
// is still the same instance that we started to remove.
115+
if (this._backdropElement == backdropToDetach) {
116+
this._backdropElement = null;
117+
}
118+
}
119+
};
120+
104121
backdropToDetach.classList.remove('md-overlay-backdrop-showing');
105122
backdropToDetach.classList.remove(this._state.backdropClass);
106-
backdropToDetach.addEventListener('transitionend', () => {
107-
backdropToDetach.parentNode.removeChild(backdropToDetach);
108-
109-
// It is possible that a new portal has been attached to this overlay since we started
110-
// removing the backdrop. If that is the case, only clear the backdrop reference if it
111-
// is still the same instance that we started to remove.
112-
if (this._backdropElement == backdropToDetach) {
113-
this._backdropElement = null;
114-
}
115-
});
123+
backdropToDetach.addEventListener('transitionend', onTransitionEnd);
124+
125+
// If the backdrop doesn't have a transition, the `transitionend` event won't fire.
126+
// In this case we make it unclickable and we try to remove it after a delay.
127+
backdropToDetach.style.pointerEvents = 'none';
128+
setTimeout(onTransitionEnd, 500);
116129
}
117130
}
118131
}

src/lib/dialog/dialog.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
flushMicrotasks,
66
ComponentFixture,
77
TestBed,
8+
tick,
89
} from '@angular/core/testing';
910
import {By} from '@angular/platform-browser';
1011
import {NgModule, Component, Directive, ViewChild, ViewContainerRef} from '@angular/core';
@@ -207,6 +208,7 @@ describe('MdDialog', () => {
207208
.not.toBe('dialog-trigger', 'Expected the focus to change when dialog was opened.');
208209

209210
dialogRef.close();
211+
tick(500);
210212
viewContainerFixture.detectChanges();
211213
flushMicrotasks();
212214

0 commit comments

Comments
 (0)