Skip to content

Commit c336e8e

Browse files
committed
fix(refresher): finish animating before changing icon, hide when not in use
1 parent 8cf540e commit c336e8e

File tree

5 files changed

+52
-9
lines changed

5 files changed

+52
-9
lines changed

js/angular/controller/scrollController.js

+18-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ IonicModule
2020
function($scope, scrollViewOptions, $timeout, $window, $$scrollValueCache, $location, $rootScope, $document, $ionicScrollDelegate) {
2121

2222
var self = this;
23+
// for testing
24+
this.__timeout = $timeout;
2325

2426
this._scrollViewOptions = scrollViewOptions; //for testing
2527

@@ -188,14 +190,28 @@ function($scope, scrollViewOptions, $timeout, $window, $$scrollValueCache, $loca
188190
var refresher = this.refresher = refresherElement;
189191
var refresherHeight = self.refresher.clientHeight || 0;
190192
scrollView.activatePullToRefresh(refresherHeight, function() {
193+
// activateCallback
191194
refresher.classList.add('active');
192195
refresherScope.$onPulling();
193196
}, function() {
194-
refresher.classList.remove('refreshing');
195-
refresher.classList.remove('active');
197+
// deactivateCallback
198+
$timeout(function(){
199+
refresher.classList.remove('active');
200+
refresher.classList.remove('refreshing');
201+
refresher.classList.add('invisible');
202+
},300);
196203
}, function() {
204+
// startCallback
197205
refresher.classList.add('refreshing');
198206
refresherScope.$onRefresh();
207+
},function(){
208+
// showCallback
209+
refresher.classList.remove('invisible');
210+
console.log('showing')
211+
},function(){
212+
// hideCallback
213+
refresher.classList.add('invisible');
214+
console.log('hiding');
199215
});
200216
};
201217
}]);

js/angular/directive/refresher.js

-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ IonicModule
9595
scrollCtrl._setRefresher($scope, $element[0]);
9696
$scope.$on('scroll.refreshComplete', function() {
9797
$scope.$evalAsync(function() {
98-
$element[0].classList.remove('active');
9998
scrollCtrl.scrollView.finishPullToRefresh();
10099
});
101100
});

js/views/scrollView.js

+18-2
Original file line numberDiff line numberDiff line change
@@ -1261,16 +1261,19 @@ ionic.views.Scroll = ionic.views.View.inherit({
12611261
* @param activateCallback {Function} Callback to execute on activation. This is for signalling the user about a refresh is about to happen when he release.
12621262
* @param deactivateCallback {Function} Callback to execute on deactivation. This is for signalling the user about the refresh being cancelled.
12631263
* @param startCallback {Function} Callback to execute to start the real async refresh action. Call {@link #finishPullToRefresh} after finish of refresh.
1264+
* @param showCallback {Function} Callback to execute when the refresher should be shown. This is for showing the refresher during a negative scrollTop.
1265+
* @param hideCallback {Function} Callback to execute when the refresher should be hidden. This is for hiding the refresher when it's behind the nav bar.
12641266
*/
1265-
activatePullToRefresh: function(height, activateCallback, deactivateCallback, startCallback) {
1267+
activatePullToRefresh: function(height, activateCallback, deactivateCallback, startCallback, showCallback, hideCallback) {
12661268

12671269
var self = this;
12681270

12691271
self.__refreshHeight = height;
12701272
self.__refreshActivate = activateCallback;
12711273
self.__refreshDeactivate = deactivateCallback;
12721274
self.__refreshStart = startCallback;
1273-
1275+
self.__refreshShow = showCallback;
1276+
self.__refreshHide = hideCallback;
12741277
},
12751278

12761279

@@ -1741,6 +1744,15 @@ ionic.views.Scroll = ionic.views.View.inherit({
17411744
// Support pull-to-refresh (only when only y is scrollable)
17421745
if (!self.__enableScrollX && self.__refreshHeight != null) {
17431746

1747+
// hide the refresher when it's behind the header bar in case of header transparency
1748+
if(scrollTop < 0){
1749+
self.__refreshHidden = false;
1750+
self.__refreshShow();
1751+
}else{
1752+
self.__refreshHide();
1753+
self.__refreshHidden = true;
1754+
}
1755+
17441756
if (!self.__refreshActive && scrollTop <= -self.__refreshHeight) {
17451757

17461758
self.__refreshActive = true;
@@ -1767,6 +1779,10 @@ ionic.views.Scroll = ionic.views.View.inherit({
17671779
scrollTop = 0;
17681780

17691781
}
1782+
}else if(self.__refreshHeight && !self.__refreshHidden){
1783+
// if a positive scroll value and the refresher is still not hidden, hide it
1784+
self.__refreshHide();
1785+
self.__refreshHidden = true;
17701786
}
17711787
}
17721788

test/unit/angular/controller/scrollController.unit.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -354,10 +354,12 @@ describe('$ionicScroll Controller', function() {
354354
setup({
355355
el: angular.element('<div><div class="scroll-refresher"></div></div>')[0]
356356
});
357-
spyOn(ctrl.scrollView, 'activatePullToRefresh').andCallFake(function(height, start, refreshing, done) {
357+
spyOn(ctrl.scrollView, 'activatePullToRefresh').andCallFake(function(height, start, refreshing, done, show, hide) {
358358
startCb = start;
359359
refreshingCb = refreshing;
360360
doneCb = done;
361+
showCb = show;
362+
hideCb = hide;
361363
});
362364
ctrl._setRefresher(scope, ctrl.element);
363365

@@ -378,15 +380,26 @@ describe('$ionicScroll Controller', function() {
378380
expect(scope.$onPulling).toHaveBeenCalled();
379381

380382
refreshingCb();
381-
expect(refresher.classList.contains('active')).toBe(false);
383+
expect(refresher.classList.contains('active')).toBe(true);
382384
expect(refresher.classList.contains('refreshing')).toBe(false);
383385

384386
expect(scope.$onRefresh).not.toHaveBeenCalled();
385387

386388
doneCb();
387-
expect(refresher.classList.contains('active')).toBe(false);
389+
expect(refresher.classList.contains('active')).toBe(true);
388390
expect(refresher.classList.contains('refreshing')).toBe(true);
389391
expect(scope.$onRefresh).toHaveBeenCalled();
392+
timeout.flush();
393+
394+
expect(refresher.classList.contains('active')).toBe(false);
395+
expect(refresher.classList.contains('refreshing')).toBe(false);
396+
expect(refresher.classList.contains('invisible')).toBe(true);
397+
398+
showCb();
399+
expect(refresher.classList.contains('invisible')).toBe(false);
400+
401+
hideCb();
402+
expect(refresher.classList.contains('invisible')).toBe(true);
390403
});
391404

392405
});

test/unit/angular/directive/refresher.unit.js

-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ describe('ionRefresher directive', function() {
6565
expect(el.hasClass('active')).toBe(true);
6666
expect(ctrl.scrollView.finishPullToRefresh).not.toHaveBeenCalled();
6767
el.scope().$apply();
68-
expect(el.hasClass('active')).toBe(false);
6968
expect(ctrl.scrollView.finishPullToRefresh).toHaveBeenCalled();
7069
});
7170

0 commit comments

Comments
 (0)