diff --git a/src/lib/dialog/dialog-container.ts b/src/lib/dialog/dialog-container.ts index 5768c706e039..24cc5f96958d 100644 --- a/src/lib/dialog/dialog-container.ts +++ b/src/lib/dialog/dialog-container.ts @@ -68,6 +68,7 @@ export function throwMdDialogContentAlreadyAttachedError() { '[attr.aria-labelledby]': '_ariaLabelledBy', '[attr.aria-describedby]': '_config?.ariaDescribedBy || null', '[@slideDialog]': '_state', + '(@slideDialog.start)': 'this._isAnimating = true', '(@slideDialog.done)': '_onAnimationDone($event)', }, }) @@ -96,6 +97,9 @@ export class MdDialogContainer extends BasePortalHost { /** ID of the element that should be considered as the dialog's label. */ _ariaLabelledBy: string | null = null; + /** Whether the container is currently mid-animation. */ + _isAnimating = false; + constructor( private _ngZone: NgZone, private _elementRef: ElementRef, @@ -175,5 +179,7 @@ export class MdDialogContainer extends BasePortalHost { this._restoreFocus(); this._onAnimationStateChange.complete(); } + + this._isAnimating = false; } } diff --git a/src/lib/dialog/dialog-ref.ts b/src/lib/dialog/dialog-ref.ts index dd6c07943bda..260afb36e45f 100644 --- a/src/lib/dialog/dialog-ref.ts +++ b/src/lib/dialog/dialog-ref.ts @@ -97,6 +97,11 @@ export class MdDialogRef { return this; } + /** Returns whether the dialog is animating. */ + _isAnimating(): boolean { + return this._containerInstance._isAnimating; + } + /** Fetches the position strategy object from the overlay ref. */ private _getPositionStrategy(): GlobalPositionStrategy { return this._overlayRef.getState().positionStrategy as GlobalPositionStrategy; diff --git a/src/lib/dialog/dialog.ts b/src/lib/dialog/dialog.ts index 2a5b830c882a..09ee902729f4 100644 --- a/src/lib/dialog/dialog.ts +++ b/src/lib/dialog/dialog.ts @@ -91,11 +91,19 @@ export class MdDialog { */ open(componentOrTemplateRef: ComponentType | TemplateRef, config?: MdDialogConfig): MdDialogRef { + + const inProgressDialog = this._openDialogs.find(dialog => dialog._isAnimating()); + + // If there's a dialog that is in the process of being opened, return it instead. + if (inProgressDialog) { + return inProgressDialog; + } + config = _applyConfigDefaults(config); - let overlayRef = this._createOverlay(config); - let dialogContainer = this._attachDialogContainer(overlayRef, config); - let dialogRef = + const overlayRef = this._createOverlay(config); + const dialogContainer = this._attachDialogContainer(overlayRef, config); + const dialogRef = this._attachDialogContent(componentOrTemplateRef, dialogContainer, overlayRef, config); if (!this._openDialogs.length) {