diff --git a/js/angular/controller/sideMenuController.js b/js/angular/controller/sideMenuController.js index e333c463f4e..a9ba7f4c54e 100644 --- a/js/angular/controller/sideMenuController.js +++ b/js/angular/controller/sideMenuController.js @@ -3,9 +3,13 @@ IonicModule '$scope', '$attrs', '$ionicSideMenuDelegate', -function($scope, $attrs, $ionicSideMenuDelegate) { + '$ionicPlatform', +function($scope, $attrs, $ionicSideMenuDelegate, $ionicPlatform) { + var self = this; angular.extend(this, ionic.controllers.SideMenuController.prototype); + this.$scope = $scope; + ionic.controllers.SideMenuController.call(this, { left: { width: 275 }, right: { width: 275 } @@ -28,6 +32,21 @@ function($scope, $attrs, $ionicSideMenuDelegate) { $scope.sideMenuContentTranslateX = 0; + + var deregisterBackButtonAction = angular.noop; + var closeSideMenu = angular.bind(this, this.close); + $scope.$watch(function() { + return self.getOpenAmount() !== 0; + }, function(isOpen) { + deregisterBackButtonAction(); + if (isOpen) { + deregisterBackButtonAction = $ionicPlatform.registerBackButtonAction( + closeSideMenu, + PLATFORM_BACK_BUTTON_PRIORITY_SIDE_MENU + ); + } + }); + var deregisterInstance = $ionicSideMenuDelegate._registerInstance( this, $attrs.delegateHandle ); diff --git a/js/angular/service/platform.js b/js/angular/service/platform.js index 2a566fc78e9..87208297839 100644 --- a/js/angular/service/platform.js +++ b/js/angular/service/platform.js @@ -1,4 +1,5 @@ var PLATFORM_BACK_BUTTON_PRIORITY_VIEW = 100; +var PLATFORM_BACK_BUTTON_PRIORITY_SIDE_MENU = 150; var PLATFORM_BACK_BUTTON_PRIORITY_ACTION_SHEET = 300; var PLATFORM_BACK_BUTTON_PRIORITY_POPUP = 400; var PLATFORM_BACK_BUTTON_PRIORITY_LOADING = 500; diff --git a/test/unit/angular/controller/sideMenuController.unit.js b/test/unit/angular/controller/sideMenuController.unit.js new file mode 100644 index 00000000000..d8ac4d31b27 --- /dev/null +++ b/test/unit/angular/controller/sideMenuController.unit.js @@ -0,0 +1,37 @@ +describe('$ionicSideMenus controller', function() { + beforeEach(module('ionic')); + + function setup(locals, props) { + var ctrl; + inject(function($controller, $rootScope) { + var scope = $rootScope.$new(); + ctrl = $controller('$ionicSideMenus', angular.extend({ + $scope: scope, + $attrs: {} + }, locals || {})); + angular.extend(ctrl, props || {}); + }); + return ctrl; + } + + it('should register with backButton on open and dereg on close', inject(function($ionicPlatform) { + var openAmount = 0; + var deregSpy = jasmine.createSpy('deregister'); + spyOn($ionicPlatform, 'registerBackButtonAction').andReturn(deregSpy); + + var ctrl = setup(); + spyOn(ctrl, 'getOpenAmount').andCallFake(function() { return openAmount; }); + + expect($ionicPlatform.registerBackButtonAction).not.toHaveBeenCalled(); + openAmount = 1; + ctrl.$scope.$apply(); + expect($ionicPlatform.registerBackButtonAction).toHaveBeenCalledWith( + jasmine.any(Function), + PLATFORM_BACK_BUTTON_PRIORITY_SIDE_MENU + ); + expect(deregSpy).not.toHaveBeenCalled(); + openAmount = 0; + ctrl.$scope.$apply(); + expect(deregSpy).toHaveBeenCalled(); + })); +});