Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit 1f01d26

Browse files
EladBezalelThomasBurleson
authored andcommitted
feat(sidenav): added onClose callback
Added onClose callback to handle close, backdrop click or escape key pressed fixes #3179 Closes #5974
1 parent 4304e88 commit 1f01d26

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

src/components/sidenav/sidenav.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ angular
6161
* // Sync check to whether given sidenav is locked open
6262
* // If this is true, the sidenav will be open regardless of close()
6363
* $mdSidenav(componentId).isLockedOpen();
64+
* // On close callback to handle close, backdrop click or escape key pressed
65+
* // Callback happens BEFORE the close action occurs.
66+
* $mdSidenav(componentId).onClose(function () {
67+
* $log.debug('closing');
68+
* });
6469
* </hljs>
6570
*/
6671
function SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {
@@ -103,6 +108,7 @@ function SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {
103108
toggle : rejectFn,
104109
open : rejectFn,
105110
close : rejectFn,
111+
onClose : angular.noop,
106112
then : function(callback) {
107113
return waitForInstance(handle)
108114
.then(callback || angular.noop);
@@ -422,6 +428,8 @@ function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $animate,
422428
return $q.when(true);
423429

424430
} else {
431+
if (scope.isOpen && sidenavCtrl.onCloseCb) sidenavCtrl.onCloseCb();
432+
425433
return $q(function(resolve){
426434
// Toggle value to force an async `updateIsOpen()` to run
427435
scope.isOpen = isOpen;
@@ -485,6 +493,12 @@ function SidenavController($scope, $element, $attrs, $mdComponentRegistry, $q) {
485493
self.isOpen = function() { return !!$scope.isOpen; };
486494
self.isLockedOpen = function() { return !!$scope.isLockedOpen; };
487495

496+
// Synchronous setters
497+
self.onClose = function (callback) {
498+
self.onCloseCb = callback;
499+
return self;
500+
};
501+
488502
// Async actions
489503
self.open = function() { return self.$toggleOpen( true ); };
490504
self.close = function() { return self.$toggleOpen( false ); };

src/components/sidenav/sidenav.spec.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,63 @@ describe('mdSidenav', function() {
439439
expect(instance).toBeDefined();
440440
expect(instance.isOpen()).toBeFalsy();
441441
}));
442+
443+
describe('onClose', function () {
444+
it('should call callback on escape', inject(function($mdSidenav, $rootScope, $material, $mdConstant, $timeout) {
445+
var el = setup('md-component-id="left" md-is-open="show"');
446+
var callback = jasmine.createSpy("callback spy");
447+
448+
$mdSidenav('left')
449+
.onClose(callback);
450+
451+
$rootScope.$apply('show = true');
452+
453+
$material.flushOutstandingAnimations();
454+
el.parent().triggerHandler({
455+
type: 'keydown',
456+
keyCode: $mdConstant.KEY_CODE.ESCAPE
457+
});
458+
$timeout.flush();
459+
expect($rootScope.show).toBe(false);
460+
expect(callback).toHaveBeenCalled();
461+
}));
462+
463+
it('should call callback on backdrop click', inject(function($mdSidenav, $rootScope, $material, $timeout) {
464+
var el = setup('md-component-id="left" md-is-open="show"');
465+
var callback = jasmine.createSpy("callback spy");
466+
467+
$mdSidenav('left')
468+
.onClose(callback);
469+
470+
$rootScope.$apply('show = true');
471+
472+
$material.flushOutstandingAnimations();
473+
el.parent().find('md-backdrop').triggerHandler('click');
474+
$timeout.flush();
475+
expect($rootScope.show).toBe(false);
476+
expect(callback).toHaveBeenCalled();
477+
}));
478+
479+
it('should call callback on close', inject(function($mdSidenav, $rootScope, $material, $timeout) {
480+
var el = setup('md-component-id="left"');
481+
var callback = jasmine.createSpy("callback spy");
482+
483+
$mdSidenav('left')
484+
.onClose(callback)
485+
.open();
486+
487+
$timeout.flush();
488+
489+
expect(el.hasClass('md-closed')).toBe(false);
490+
491+
$mdSidenav('left')
492+
.close();
493+
494+
$timeout.flush();
495+
496+
expect(callback).toHaveBeenCalled();
497+
}));
498+
});
442499
});
443500

444501

0 commit comments

Comments
 (0)