From ea289b81c6a54d5adb3515b692d2dbec569d0498 Mon Sep 17 00:00:00 2001 From: Andy Joslin Date: Thu, 6 Feb 2014 09:51:35 -0500 Subject: [PATCH] fix(ionicScrollDelegate): trigger resize before scrolling to top/bottom Closes #522 --- .../service/delegates/ionicScrollDelegate.js | 31 ++++++---- .../delegates/ionicScrollDelegate.unit.js | 62 ++++++++++++------- 2 files changed, 58 insertions(+), 35 deletions(-) diff --git a/js/ext/angular/src/service/delegates/ionicScrollDelegate.js b/js/ext/angular/src/service/delegates/ionicScrollDelegate.js index a507886913..d4e6afad59 100644 --- a/js/ext/angular/src/service/delegates/ionicScrollDelegate.js +++ b/js/ext/angular/src/service/delegates/ionicScrollDelegate.js @@ -26,7 +26,7 @@ angular.module('ionic.ui.service.scrollDelegate', []) if(ionic.DomUtil.rectContains(e.gesture.touches[0].pageX, e.gesture.touches[0].pageY, bounds.left, bounds.top, bounds.left + bounds.width, bounds.top + 20)) { _this.scrollTop(); - } + } }, element[0]); }, @@ -47,6 +47,14 @@ angular.module('ionic.ui.service.scrollDelegate', []) * $scope {Scope} the scope to register and listen for events */ register: function($scope, $element) { + + function scrollViewResize() { + // Run the resize after this digest + return $timeout(function() { + $scope.$parent.scrollView && $scope.$parent.scrollView.resize(); + }); + } + $element.bind('scroll', function(e) { $scope.onScroll({ event: e, @@ -56,10 +64,7 @@ angular.module('ionic.ui.service.scrollDelegate', []) }); $scope.$parent.$on('scroll.resize', function(e) { - // Run the resize after this digest - $timeout(function() { - $scope.$parent.scrollView && $scope.$parent.scrollView.resize(); - }); + scrollViewResize(); }); // Called to stop refreshing on the scroll view @@ -73,14 +78,18 @@ angular.module('ionic.ui.service.scrollDelegate', []) * @param animate {boolean} whether to animate or just snap */ $scope.$parent.$on('scroll.scrollTop', function(e, animate) { - $scope.$parent.scrollView && $scope.$parent.scrollView.scrollTo(0, 0, animate === false ? false : true); + scrollViewResize().then(function() { + $scope.$parent.scrollView && $scope.$parent.scrollView.scrollTo(0, 0, animate === false ? false : true); + }); }); $scope.$parent.$on('scroll.scrollBottom', function(e, animate) { - var sv = $scope.$parent.scrollView; - var max; - if(!sv) { return; } - max = sv.getScrollMax(); - sv.scrollTo(0, max.top, animate === false ? false : true); + scrollViewResize().then(function() { + var sv = $scope.$parent.scrollView; + if (sv) { + var max = sv.getScrollMax(); + sv.scrollTo(0, max.top, animate === false ? false : true); + } + }); }); } }; diff --git a/js/ext/angular/test/service/delegates/ionicScrollDelegate.unit.js b/js/ext/angular/test/service/delegates/ionicScrollDelegate.unit.js index 320a13c4c3..03ca1039ba 100644 --- a/js/ext/angular/test/service/delegates/ionicScrollDelegate.unit.js +++ b/js/ext/angular/test/service/delegates/ionicScrollDelegate.unit.js @@ -27,45 +27,59 @@ describe('Ionic ScrollDelegate Service', function() { expect(sv).not.toBe(undefined); }); - it('Should scroll top', function() { - spyOn(del, 'register'); + it('should resize', function() { + var scope = rootScope.$new(); + var el = compile('')(scope); + var sv = del.getScrollView(scope); + spyOn(sv, 'resize'); + + del.resize(); + timeout.flush(); + expect(sv.resize).toHaveBeenCalled(); + }); + + it('Should resize & scroll top', function() { var scope = rootScope.$new(); var el = compile('')(scope); var sv = del.getScrollView(scope); + spyOn(sv, 'resize'); - var v = sv.getValues(); + expect(sv.getValues().top).toBe(100); - expect(v.top).toBe(100); + del.scrollTop(false); + timeout.flush(); + expect(sv.resize).toHaveBeenCalled(); - del.scrollTop(); - - expect(v.top).toBe(100); + expect(sv.getValues().top).toBe(0); }); - /* - it('Should scroll bottom', function() { - spyOn(del, 'register'); - + it('Should resize & scroll top', function() { var scope = rootScope.$new(); - var el = compile('
')(scope); + var el = compile('')(scope); var sv = del.getScrollView(scope); + spyOn(sv, 'resize'); + + expect(sv.getValues().top).toBe(100); + + del.scrollBottom(false); timeout.flush(); - sv.resize(); + expect(sv.resize).toHaveBeenCalled(); - var v = sv.getValues(); - - - expect(v.top).toBe(100); - - - console.log(sv.getScrollMax()); - del.scrollBottom(); - - expect(v.top).toBe(100); + expect(sv.getValues().top).toBe(sv.getScrollMax().top); }); - */ + + it('should finish refreshing', function() { + var scope = rootScope.$new(); + var el = compile('')(scope); + + var sv = del.getScrollView(scope); + spyOn(sv, 'finishPullToRefresh'); + + del.finishRefreshing(scope); + expect(sv.finishPullToRefresh).toHaveBeenCalled(); + }); });