diff --git a/src/lib/snack-bar/snack-bar-container.ts b/src/lib/snack-bar/snack-bar-container.ts index 2a88f0e453ee..61d1ec646d42 100644 --- a/src/lib/snack-bar/snack-bar-container.ts +++ b/src/lib/snack-bar/snack-bar-container.ts @@ -92,11 +92,9 @@ export class MdSnackBarContainer extends BasePortalHost implements OnDestroy { /** Handle end of animations, updating the state of the snackbar. */ onAnimationEnd(event: AnimationTransitionEvent) { if (event.toState === 'void' || event.toState === 'complete') { - this._ngZone.run(() => { - this.onExit.next(); - this.onExit.complete(); - }); + this._completeExit(); } + if (event.toState === 'visible') { this._ngZone.run(() => { this.onEnter.next(); @@ -131,8 +129,14 @@ export class MdSnackBarContainer extends BasePortalHost implements OnDestroy { * Makes sure the exit callbacks have been invoked when the element is destroyed. */ ngOnDestroy() { - // Wait for the zone to settle before removing the element. Helps prevent - // errors where we end up removing an element which is in the middle of an animation. + this._completeExit(); + } + + /** + * Waits for the zone to settle before removing the element. Helps prevent + * errors where we end up removing an element which is in the middle of an animation. + */ + private _completeExit() { this._ngZone.onMicrotaskEmpty.first().subscribe(() => { this.onExit.next(); this.onExit.complete();