diff --git a/js/ext/angular/src/service/delegates/ionicScrollDelegate.js b/js/ext/angular/src/service/delegates/ionicScrollDelegate.js index 51c5dbb0c0..d43555217b 100644 --- a/js/ext/angular/src/service/delegates/ionicScrollDelegate.js +++ b/js/ext/angular/src/service/delegates/ionicScrollDelegate.js @@ -17,8 +17,8 @@ angular.module('ionic.ui.service.scrollDelegate', []) resize: function() { $rootScope.$broadcast('scroll.resize'); }, - anchorScroll: function() { - $rootScope.$broadcast('scroll.anchorScroll'); + anchorScroll: function(animate) { + $rootScope.$broadcast('scroll.anchorScroll', animate); }, tapScrollToTop: function(element) { var _this = this; @@ -80,14 +80,14 @@ angular.module('ionic.ui.service.scrollDelegate', []) scrollView.finishPullToRefresh(); }); - $scope.$parent.$on('scroll.anchorScroll', function() { + $scope.$parent.$on('scroll.anchorScroll', function(e, animate) { var hash = $location.hash(); var elm; if (hash && (elm = document.getElementById(hash)) ) { var scroll = ionic.DomUtil.getPositionInParent(elm, scrollEl); - scrollView.scrollTo(scroll.left, scroll.top); + scrollView.scrollTo(scroll.left, scroll.top, !!animate); } else { - scrollView.scrollTo(0,0); + scrollView.scrollTo(0,0, !!animate); } }); diff --git a/js/ext/angular/test/service/delegates/ionicScrollDelegate.unit.js b/js/ext/angular/test/service/delegates/ionicScrollDelegate.unit.js index c65b119bc9..397264a236 100644 --- a/js/ext/angular/test/service/delegates/ionicScrollDelegate.unit.js +++ b/js/ext/angular/test/service/delegates/ionicScrollDelegate.unit.js @@ -92,66 +92,57 @@ describe('anchorScroll', function() { beforeEach(module('ionic')); - var contentEl, scope, del; - beforeEach(inject(function($rootScope, $compile, $timeout, $document, $ionicScrollDelegate) { - scope = $rootScope.$new(); - contentEl = $compile('')(scope); + testWithAnimate(true); + testWithAnimate(false); - document.body.appendChild(contentEl[0]); - del = $ionicScrollDelegate; - })); + function testWithAnimate(animate) { + describe('with animate=' + animate, function() { + var contentEl, scope, del; + beforeEach(inject(function($rootScope, $compile, $timeout, $document, $ionicScrollDelegate) { + scope = $rootScope.$new(); + contentEl = $compile('')(scope); - it('should anchorScroll to an element with id', function() { - var anchorMe = angular.element('
'); - var sv = del.getScrollView(scope); - spyOn(sv, 'scrollTo'); + document.body.appendChild(contentEl[0]); + del = $ionicScrollDelegate; + })); - setLocationHash('anchorMe'); - contentEl.append(anchorMe); + it('should anchorScroll to an element with id', function() { + var anchorMe = angular.element('
'); + var sv = del.getScrollView(scope); + spyOn(sv, 'scrollTo'); + spyOn(ionic.DomUtil, 'getPositionInParent').andCallFake(function() { + return { left: 2, top: 1 }; + }); - var pos = ionic.DomUtil.getPositionInParent(anchorMe[0], contentEl[0]); - del.anchorScroll(); - expect(sv.scrollTo).toHaveBeenCalledWith(pos.left, pos.top); - }); + setLocationHash('anchorMe'); + contentEl.append(anchorMe); - it('should anchorScroll to top if !$location.hash()', function() { - var sv = del.getScrollView(scope); - spyOn(sv, 'scrollTo'); - del.anchorScroll(); - expect(sv.scrollTo).toHaveBeenCalledWith(0, 0); - }); + del.anchorScroll(animate); + expect(sv.scrollTo).toHaveBeenCalledWith(2, 1, animate); + }); - it('should anchorScroll to top if element with hash id doesnt exist', function() { - var sv = del.getScrollView(scope); - spyOn(sv, 'scrollTo'); + it('should anchorScroll to top if !$location.hash()', function() { + var sv = del.getScrollView(scope); + spyOn(sv, 'scrollTo'); + spyOn(ionic.DomUtil, 'getPositionInParent'); + del.anchorScroll(animate); + expect(sv.scrollTo).toHaveBeenCalledWith(0, 0, animate); + expect(ionic.DomUtil.getPositionInParent).not.toHaveBeenCalled(); + }); - setLocationHash('doesnotexist'); - del.anchorScroll(); + it('should anchorScroll to top if element with hash id doesnt exist', function() { + var sv = del.getScrollView(scope); + spyOn(sv, 'scrollTo'); + spyOn(ionic.DomUtil, 'getPositionInParent'); - expect(sv.scrollTo).toHaveBeenCalledWith(0, 0); - }); + setLocationHash('doesnotexist'); + del.anchorScroll(animate); - it('should anchorScroll to first element with id if multiple exist', function() { - var foo1 = angular.element('
hello
'); - var foo2 = angular.element('
hola
'); - var sv = del.getScrollView(scope); - - contentEl.append(foo1).append(foo2); - - //Fake the top/left because dom doesn't have time to load in a test - spyOn(ionic.DomUtil, 'getPositionInParent').andCallFake(function(el) { - return el === foo1[0] ? {left: 20, top: 40} : {left: 30, top: 50}; + expect(sv.scrollTo).toHaveBeenCalledWith(0, 0, animate); + expect(ionic.DomUtil.getPositionInParent).not.toHaveBeenCalled(); + }); }); - var pos1 = ionic.DomUtil.getPositionInParent(foo1[0], contentEl[0]); - var pos2 = ionic.DomUtil.getPositionInParent(foo2[0], contentEl[0]); - - spyOn(sv, 'scrollTo'); - setLocationHash('foo'); - del.anchorScroll(); - expect(sv.scrollTo.callCount).toBe(1); - expect(sv.scrollTo).toHaveBeenCalledWith(pos1.left, pos1.top); - expect(sv.scrollTo).not.toHaveBeenCalledWith(pos2.left, pos2.top); - }); + } });