From 878c81706df82c183a0ead4abe20b36a0eedf32f Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 5 Feb 2015 13:41:03 -0700 Subject: [PATCH] fix($ionicLoading): make `hideOnStateChange` work if loader is delayed Closes #3022. --- js/angular/service/loading.js | 45 +++++++++++------------ test/unit/angular/service/loading.unit.js | 2 - 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/js/angular/service/loading.js b/js/angular/service/loading.js index a94f8f5939..d0d1193f4d 100644 --- a/js/angular/service/loading.js +++ b/js/angular/service/loading.js @@ -111,10 +111,8 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, template: LOADING_TPL, appendTo: $ionicBody.get() }) - .then(function(loader) { - var self = loader; - - loader.show = function(options) { + .then(function(self) { + self.show = function(options) { var templatePromise = options.templateUrl ? $ionicTemplateLoader.load(options.templateUrl) : //options.content: deprecated @@ -122,19 +120,19 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, self.scope = options.scope || self.scope; - if (!this.isShown) { + if (!self.isShown) { //options.showBackdrop: deprecated - this.hasBackdrop = !options.noBackdrop && options.showBackdrop !== false; - if (this.hasBackdrop) { + self.hasBackdrop = !options.noBackdrop && options.showBackdrop !== false; + if (self.hasBackdrop) { $ionicBackdrop.retain(); $ionicBackdrop.getElement().addClass('backdrop-loading'); } } if (options.duration) { - $timeout.cancel(this.durationTimeout); - this.durationTimeout = $timeout( - angular.bind(this, this.hide), + $timeout.cancel(self.durationTimeout); + self.durationTimeout = $timeout( + angular.bind(self, self.hide), +options.duration ); } @@ -165,13 +163,13 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, } }); - this.isShown = true; + self.isShown = true; }; - loader.hide = function() { + self.hide = function() { deregisterBackAction(); - if (this.isShown) { - if (this.hasBackdrop) { + if (self.isShown) { + if (self.hasBackdrop) { $ionicBackdrop.release(); $ionicBackdrop.getElement().removeClass('backdrop-loading'); } @@ -181,11 +179,11 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, !self.isShown && self.element.removeClass('visible'); }, 200); } - $timeout.cancel(this.durationTimeout); - this.isShown = false; + $timeout.cancel(self.durationTimeout); + self.isShown = false; }; - return loader; + return self; }); } return loaderInstance; @@ -195,14 +193,15 @@ function($ionicLoadingConfig, $ionicBody, $ionicTemplateLoader, $ionicBackdrop, options = extend({}, $ionicLoadingConfig || {}, options || {}); var delay = options.delay || options.showDelay || 0; - //If loading.show() was called previously, cancel it and show with our new options - loadingShowDelay && $timeout.cancel(loadingShowDelay); - loadingShowDelay = $timeout(noop, delay); + deregisterStateListener(); + if (options.hideOnStateChange) { + deregisterStateListener = $rootScope.$on('$stateChangeSuccess', hideLoader); + } + //If loading.show() was called previously, cancel it and show with our new options + $timeout.cancel(loadingShowDelay); + loadingShowDelay = $timeout(noop, delay); loadingShowDelay.then(getLoader).then(function(loader) { - if (options.hideOnStateChange) { - deregisterStateListener = $rootScope.$on('$stateChangeSuccess', hideLoader); - } return loader.show(options); }); diff --git a/test/unit/angular/service/loading.unit.js b/test/unit/angular/service/loading.unit.js index e28e6fa90e..7c7b4e881d 100644 --- a/test/unit/angular/service/loading.unit.js +++ b/test/unit/angular/service/loading.unit.js @@ -201,7 +201,6 @@ describe('$ionicLoading service', function() { template: '' }); spyOn(loader, 'hide'); - $timeout.flush(); $rootScope.$broadcast('$stateChangeSuccess'); $rootScope.$apply(); expect(loader.hide).toHaveBeenCalled(); @@ -213,7 +212,6 @@ describe('$ionicLoading service', function() { template: '' }); spyOn(loader, 'hide'); - $timeout.flush(); $rootScope.$broadcast('$stateChangeSuccess'); $rootScope.$apply(); expect(loader.hide).not.toHaveBeenCalled();