Skip to content

Commit 0f28daf

Browse files
crisbetotinayuangao
authored andcommitted
fix(menu): not emitting close event when closing via the backdrop (#3300)
* 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. * fix: restore method prefix
1 parent 84b5c3b commit 0f28daf

File tree

4 files changed

+38
-5
lines changed

4 files changed

+38
-5
lines changed

src/lib/menu/menu-directive.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,14 @@ export class MdMenu implements AfterContentInit, MdMenuPanel, OnDestroy {
116116
}
117117

118118
private _setPositionX(pos: MenuPositionX): void {
119-
if ( pos !== 'before' && pos !== 'after') {
119+
if (pos !== 'before' && pos !== 'after') {
120120
throw new MdMenuInvalidPositionX();
121121
}
122122
this.positionX = pos;
123123
}
124124

125125
private _setPositionY(pos: MenuPositionY): void {
126-
if ( pos !== 'above' && pos !== 'below') {
126+
if (pos !== 'above' && pos !== 'below') {
127127
throw new MdMenuInvalidPositionY();
128128
}
129129
this.positionY = pos;

src/lib/menu/menu-panel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ export interface MdMenuPanel {
99
close: EventEmitter<void>;
1010
focusFirstItem: () => void;
1111
setPositionClasses: (x: MenuPositionX, y: MenuPositionY) => void;
12+
_emitCloseEvent: () => void;
1213
}

src/lib/menu/menu-trigger.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import {MenuPositionX, MenuPositionY} from './menu-positions';
3434
* responsible for toggling the display of the provided menu instance.
3535
*/
3636
@Directive({
37-
selector: `[md-menu-trigger-for], [mat-menu-trigger-for],
37+
selector: `[md-menu-trigger-for], [mat-menu-trigger-for],
3838
[mdMenuTriggerFor], [matMenuTriggerFor]`,
3939
host: {
4040
'aria-haspopup': 'true',
@@ -144,7 +144,7 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
144144
*/
145145
private _subscribeToBackdrop(): void {
146146
this._backdropSubscription = this._overlayRef.backdropClick().subscribe(() => {
147-
this.closeMenu();
147+
this.menu._emitCloseEvent();
148148
});
149149
}
150150

src/lib/menu/menu.spec.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,34 @@ describe('MdMenu', () => {
384384

385385
});
386386

387+
describe('close event', () => {
388+
let fixture: ComponentFixture<SimpleMenu>;
389+
390+
beforeEach(() => {
391+
fixture = TestBed.createComponent(SimpleMenu);
392+
fixture.detectChanges();
393+
fixture.componentInstance.trigger.openMenu();
394+
});
395+
396+
it('should emit an event when a menu item is clicked', () => {
397+
const menuItem = overlayContainerElement.querySelector('[md-menu-item]') as HTMLElement;
398+
399+
menuItem.click();
400+
fixture.detectChanges();
401+
402+
expect(fixture.componentInstance.closeCallback).toHaveBeenCalled();
403+
});
404+
405+
it('should emit a close event when the backdrop is clicked', () => {
406+
const backdrop = <HTMLElement>overlayContainerElement.querySelector('.cdk-overlay-backdrop');
407+
408+
backdrop.click();
409+
fixture.detectChanges();
410+
411+
expect(fixture.componentInstance.closeCallback).toHaveBeenCalled();
412+
});
413+
});
414+
387415
describe('destroy', () => {
388416
it('does not throw an error on destroy', () => {
389417
const fixture = TestBed.createComponent(SimpleMenu);
@@ -395,7 +423,7 @@ describe('MdMenu', () => {
395423
@Component({
396424
template: `
397425
<button [mdMenuTriggerFor]="menu" #triggerEl>Toggle menu</button>
398-
<md-menu #menu="mdMenu">
426+
<md-menu #menu="mdMenu" (close)="closeCallback()">
399427
<button md-menu-item> Item </button>
400428
<button md-menu-item disabled> Disabled </button>
401429
</md-menu>
@@ -404,6 +432,7 @@ describe('MdMenu', () => {
404432
class SimpleMenu {
405433
@ViewChild(MdMenuTrigger) trigger: MdMenuTrigger;
406434
@ViewChild('triggerEl') triggerEl: ElementRef;
435+
closeCallback = jasmine.createSpy('menu closed callback');
407436
}
408437

409438
@Component({
@@ -456,6 +485,9 @@ class CustomMenuPanel implements MdMenuPanel {
456485
@Output() close = new EventEmitter<void>();
457486
focusFirstItem = () => {};
458487
setPositionClasses = () => {};
488+
_emitCloseEvent() {
489+
this.close.emit();
490+
}
459491
}
460492

461493
@Component({

0 commit comments

Comments
 (0)