Skip to content

Commit 93807ed

Browse files
ianjoneilltinayuangao
authored andcommitted
feat(sidenav): emit event when backdrop is clicked (#1638)
* 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 * Address review comments
1 parent 4b7e52d commit 93807ed

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

src/lib/sidenav/sidenav.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="md-sidenav-backdrop" (click)="_closeModalSidenav()"
1+
<div class="md-sidenav-backdrop" (click)="_onBackdropClicked()"
22
[class.md-sidenav-shown]="_isShowingBackdrop()"></div>
33

44
<ng-content select="md-sidenav"></ng-content>

src/lib/sidenav/sidenav.spec.ts

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

195238
describe('attributes', () => {
@@ -267,7 +310,7 @@ class SidenavLayoutTwoSidenavTestApp { }
267310
/** Test component that contains an MdSidenavLayout and one MdSidenav. */
268311
@Component({
269312
template: `
270-
<md-sidenav-layout>
313+
<md-sidenav-layout (backdrop-clicked)="backdropClicked()">
271314
<md-sidenav #sidenav align="start"
272315
(open-start)="openStart()"
273316
(open)="open()"
@@ -284,6 +327,7 @@ class BasicTestApp {
284327
openCount: number = 0;
285328
closeStartCount: number = 0;
286329
closeCount: number = 0;
330+
backdropClickedCount: number = 0;
287331

288332
openStart() {
289333
this.openStartCount++;
@@ -300,6 +344,10 @@ class BasicTestApp {
300344
close() {
301345
this.closeCount++;
302346
}
347+
348+
backdropClicked() {
349+
this.backdropClickedCount++;
350+
}
303351
}
304352

305353
@Component({

src/lib/sidenav/sidenav.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@ export class MdSidenavLayout implements AfterContentInit {
276276
get start() { return this._start; }
277277
get end() { return this._end; }
278278

279+
/** Event emitted when the sidenav backdrop is clicked. */
280+
@Output('backdrop-clicked') onBackdropClicked = new EventEmitter<void>();
281+
279282
/** The sidenav at the start/end alignment, independent of direction. */
280283
private _start: MdSidenav;
281284
private _end: MdSidenav;
@@ -380,6 +383,11 @@ export class MdSidenavLayout implements AfterContentInit {
380383
this._setDrawersValid(true);
381384
}
382385

386+
_onBackdropClicked() {
387+
this.onBackdropClicked.emit();
388+
this._closeModalSidenav();
389+
}
390+
383391
_closeModalSidenav() {
384392
if (this._start != null && this._start.mode != 'side') {
385393
this._start.close();

0 commit comments

Comments
 (0)