From 0a640758842d4307dba43aa702fe8d9dc17b164a Mon Sep 17 00:00:00 2001 From: Andy Joslin Date: Mon, 5 May 2014 10:38:33 -0600 Subject: [PATCH] fix(collectionRepeat): correctly save user scroll position on back Addresses #1157 --- js/angular/controller/scrollController.js | 20 ++++++++++--------- .../controller/scrollController.unit.js | 3 ++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/js/angular/controller/scrollController.js b/js/angular/controller/scrollController.js index 3c128e4e1b1..ed87735b7dd 100644 --- a/js/angular/controller/scrollController.js +++ b/js/angular/controller/scrollController.js @@ -76,15 +76,17 @@ function($scope, scrollViewOptions, $timeout, $window, $$scrollValueCache, $loca var viewId = historyData && historyData.viewId; if (viewId) { - self.rememberScrollPosition(viewId); - self.scrollToRememberedPosition(); - - backListenDone = $rootScope.$on('$viewHistory.viewBack', function(e, fromViewId, toViewId) { - //When going back from this view, forget its saved scroll position - if (viewId === fromViewId) { - self.forgetScrollPosition(); - } - }); + $timeout(function() { + self.rememberScrollPosition(viewId); + self.scrollToRememberedPosition(); + + backListenDone = $rootScope.$on('$viewHistory.viewBack', function(e, fromViewId, toViewId) { + //When going back from this view, forget its saved scroll position + if (viewId === fromViewId) { + self.forgetScrollPosition(); + } + }); + }, 1, false); } }); diff --git a/test/unit/angular/controller/scrollController.unit.js b/test/unit/angular/controller/scrollController.unit.js index 3b21a9ff0cd..17a6f537f62 100644 --- a/test/unit/angular/controller/scrollController.unit.js +++ b/test/unit/angular/controller/scrollController.unit.js @@ -124,11 +124,12 @@ describe('$ionicScroll Controller', function() { expect(ctrl.scrollToRememberedPosition).toHaveBeenCalled(); }); - it('should forget on $viewHistory.viewBack after $viewContentLoaded', inject(function($rootScope) { + it('should forget on $viewHistory.viewBack after $viewContentLoaded', inject(function($rootScope, $timeout) { var historyData = { viewId: 'foo' }; setup(); spyOn($rootScope, '$on').andCallThrough();; scope.$broadcast('$viewContentLoaded', historyData); + $timeout.flush(); expect(scope.$on).toHaveBeenCalledWith('$viewHistory.viewBack', jasmine.any(Function)); //Should not forget unless backViewId is the same