Skip to content

Commit 14e71c2

Browse files
committed
feat(sidenav): emit event when backdrop is clicked
This allows clients to distinguish between close events caused by calling close() and those caused by the backdrop being clicked. Closes #1427
1 parent 547a75d commit 14e71c2

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/lib/sidenav/sidenav.spec.ts

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,49 @@ describe('MdSidenav', () => {
194194
tick();
195195
}).not.toThrow();
196196
}));
197+
198+
it('should emit the backdrop-clicked event when the backdrop is clicked', fakeAsync(() => {
199+
let fixture = TestBed.createComponent(BasicTestApp);
200+
201+
let testComponent: BasicTestApp = fixture.debugElement.componentInstance;
202+
let openButtonElement = fixture.debugElement.query(By.css('.open'));
203+
openButtonElement.nativeElement.click();
204+
fixture.detectChanges();
205+
tick();
206+
207+
endSidenavTransition(fixture);
208+
tick();
209+
210+
expect(testComponent.backdropClickedCount).toBe(0);
211+
212+
let sidenavBackdropElement = fixture.debugElement.query(By.css('.md-sidenav-backdrop'));
213+
sidenavBackdropElement.nativeElement.click();
214+
fixture.detectChanges();
215+
tick();
216+
217+
expect(testComponent.backdropClickedCount).toBe(1);
218+
219+
endSidenavTransition(fixture);
220+
tick();
221+
222+
openButtonElement.nativeElement.click();
223+
fixture.detectChanges();
224+
tick();
225+
226+
endSidenavTransition(fixture);
227+
tick();
228+
229+
let closeButtonElement = fixture.debugElement.query(By.css('.close'));
230+
closeButtonElement.nativeElement.click();
231+
fixture.detectChanges();
232+
tick();
233+
234+
endSidenavTransition(fixture);
235+
tick();
236+
237+
expect(testComponent.backdropClickedCount).toBe(1);
238+
}));
239+
197240
});
198241

199242
describe('attributes', () => {
@@ -271,7 +314,7 @@ class SidenavLayoutTwoSidenavTestApp { }
271314
/** Test component that contains an MdSidenavLayout and one MdSidenav. */
272315
@Component({
273316
template: `
274-
<md-sidenav-layout>
317+
<md-sidenav-layout (backdrop-clicked)="backdropClicked()">
275318
<md-sidenav #sidenav align="start"
276319
(open-start)="openStart()"
277320
(open)="open()"
@@ -288,6 +331,7 @@ class BasicTestApp {
288331
openCount: number = 0;
289332
closeStartCount: number = 0;
290333
closeCount: number = 0;
334+
backdropClickedCount: number = 0;
291335

292336
openStart() {
293337
this.openStartCount++;
@@ -304,6 +348,10 @@ class BasicTestApp {
304348
close() {
305349
this.closeCount++;
306350
}
351+
352+
backdropClicked() {
353+
this.backdropClickedCount++;
354+
}
307355
}
308356

309357
@Component({

src/lib/sidenav/sidenav.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,9 @@ export class MdSidenavLayout implements AfterContentInit {
293293
get start() { return this._start; }
294294
get end() { return this._end; }
295295

296+
/** Event emitted when the sidenav backdrop is clicked. */
297+
@Output('backdrop-clicked') onBackdropClicked = new EventEmitter<void>();
298+
296299
/** The sidenav at the start/end alignment, independent of direction. */
297300
private _start: MdSidenav;
298301
private _end: MdSidenav;
@@ -398,6 +401,8 @@ export class MdSidenavLayout implements AfterContentInit {
398401
}
399402

400403
_closeModalSidenav() {
404+
this.onBackdropClicked.emit(null);
405+
401406
if (this._start != null && this._start.mode != 'side') {
402407
this._start.close();
403408
}

0 commit comments

Comments
 (0)