From 4d8b8fad329af092f67e6142471629172302ee8d Mon Sep 17 00:00:00 2001 From: crisbeto Date: Sat, 25 Feb 2017 20:56:29 +0100 Subject: [PATCH 1/2] fix(menu): not emitting close event when closing via the backdrop * Fixes the menu not emitting the `close` event if it is closed by clicking on the backdrop. * Adds missing test coverage for the `close` event in general. Fixes #3295. --- src/lib/menu/menu-directive.ts | 8 ++++---- src/lib/menu/menu-panel.ts | 1 + src/lib/menu/menu-trigger.ts | 4 ++-- src/lib/menu/menu.html | 2 +- src/lib/menu/menu.spec.ts | 34 +++++++++++++++++++++++++++++++++- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/lib/menu/menu-directive.ts b/src/lib/menu/menu-directive.ts index bdfcc1507b34..3ce4985bac9d 100644 --- a/src/lib/menu/menu-directive.ts +++ b/src/lib/menu/menu-directive.ts @@ -64,7 +64,7 @@ export class MdMenu implements AfterContentInit, MdMenuPanel, OnDestroy { ngAfterContentInit() { this._keyManager = new FocusKeyManager(this.items).withWrap(); this._tabSubscription = this._keyManager.tabOut.subscribe(() => { - this._emitCloseEvent(); + this.emitCloseEvent(); }); } @@ -102,19 +102,19 @@ export class MdMenu implements AfterContentInit, MdMenuPanel, OnDestroy { * This emits a close event to which the trigger is subscribed. When emitted, the * trigger will close the menu. */ - _emitCloseEvent(): void { + emitCloseEvent(): void { this.close.emit(); } private _setPositionX(pos: MenuPositionX): void { - if ( pos !== 'before' && pos !== 'after') { + if (pos !== 'before' && pos !== 'after') { throw new MdMenuInvalidPositionX(); } this.positionX = pos; } private _setPositionY(pos: MenuPositionY): void { - if ( pos !== 'above' && pos !== 'below') { + if (pos !== 'above' && pos !== 'below') { throw new MdMenuInvalidPositionY(); } this.positionY = pos; diff --git a/src/lib/menu/menu-panel.ts b/src/lib/menu/menu-panel.ts index dd3728cd2e7b..1835782e5fc0 100644 --- a/src/lib/menu/menu-panel.ts +++ b/src/lib/menu/menu-panel.ts @@ -8,5 +8,6 @@ export interface MdMenuPanel { templateRef: TemplateRef; close: EventEmitter; focusFirstItem: () => void; + emitCloseEvent: () => void; setPositionClasses: (x: MenuPositionX, y: MenuPositionY) => void; } diff --git a/src/lib/menu/menu-trigger.ts b/src/lib/menu/menu-trigger.ts index aac7d0bd034f..acf08725fe7d 100644 --- a/src/lib/menu/menu-trigger.ts +++ b/src/lib/menu/menu-trigger.ts @@ -33,7 +33,7 @@ import {MenuPositionX, MenuPositionY} from './menu-positions'; * TODO(andrewseguin): Remove the kebab versions in favor of camelCased attribute selectors */ @Directive({ - selector: `[md-menu-trigger-for], [mat-menu-trigger-for], + selector: `[md-menu-trigger-for], [mat-menu-trigger-for], [mdMenuTriggerFor], [matMenuTriggerFor]`, host: { 'aria-haspopup': 'true', @@ -143,7 +143,7 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy { */ private _subscribeToBackdrop(): void { this._backdropSubscription = this._overlayRef.backdropClick().subscribe(() => { - this.closeMenu(); + this.menu.emitCloseEvent(); }); } diff --git a/src/lib/menu/menu.html b/src/lib/menu/menu.html index 3360ab135e2e..582c8876a889 100644 --- a/src/lib/menu/menu.html +++ b/src/lib/menu/menu.html @@ -1,6 +1,6 @@