Skip to content

Commit 7b0716c

Browse files
committed
feat(ionInfiniteScroll): use event system
Fixes #661. BREAKING CHANGE: The binding for ionInfiniteScroll has changed, as well as how you finish it. If you had this code before: ```html <ion-content on-infinite-scroll="doSomething"></ion-content> ``` ```js function MyCtrl($scope) { $scope.doSomething = function(scrollDoneCallback) { doSomething(); scrollDoneCallback(); }; } ```js Now, your code should look like this: ```html <ion-content on-infinite-scroll="doSomething()"></ion-content> ``` ``js function MyCtrl($scope) { $scope.doSomething = function() { doSomething(); $scope.$broadcast('scroll.infiniteScrollComplete'); }; } ```
1 parent 997aec8 commit 7b0716c

File tree

2 files changed

+50
-42
lines changed

2 files changed

+50
-42
lines changed

js/ext/angular/src/directive/ionicContent.js

+43-39
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ function($parse, $timeout, $ionicScrollDelegate, $controller, $ionicBind) {
8787
$onRefreshOpening: '&onRefreshOpening',
8888
$onScroll: '&onScroll',
8989
$onScrollComplete: '&onScrollComplete',
90+
$onInfiniteScroll: '&onInfiniteScroll',
9091
refreshComplete: '=',
91-
onInfiniteScroll: '&',
9292
infiniteScrollDistance: '@',
9393
hasBouncing: '@',
9494
scroll: '@',
@@ -160,40 +160,6 @@ function($parse, $timeout, $ionicScrollDelegate, $controller, $ionicBind) {
160160
}
161161
};
162162
}
163-
164-
// Check if this supports infinite scrolling and listen for scroll events
165-
// to trigger the infinite scrolling
166-
// TODO(ajoslin): move functionality out of this function and make testable
167-
var infiniteScroll = $element.find('ion-infinite-scroll');
168-
var infiniteStarted = false;
169-
if(infiniteScroll) {
170-
// Parse infinite scroll distance
171-
var distance = attr.infiniteScrollDistance || '1%';
172-
var maxScroll;
173-
if(distance.indexOf('%')) {
174-
// It's a multiplier
175-
maxScroll = function() {
176-
return scrollView.getScrollMax().top * ( 1 - parseInt(distance, 10) / 100 );
177-
};
178-
} else {
179-
// It's a pixel value
180-
maxScroll = function() {
181-
return scrollView.getScrollMax().top - parseInt(distance, 10);
182-
};
183-
}
184-
$element.bind('scroll', function(e) {
185-
if( scrollView && !infiniteStarted && (scrollView.getValues().top > maxScroll() ) ) {
186-
infiniteStarted = true;
187-
infiniteScroll.addClass('active');
188-
var cb = function() {
189-
scrollView.resize();
190-
infiniteStarted = false;
191-
infiniteScroll.removeClass('active');
192-
};
193-
$scope.$apply(angular.bind($scope, $scope.onInfiniteScroll, cb));
194-
}
195-
});
196-
}
197163
}
198164
}
199165
};
@@ -218,12 +184,50 @@ function($parse, $timeout, $ionicScrollDelegate, $controller, $ionicBind) {
218184
};
219185
})
220186

221-
.directive('ionInfiniteScroll', function() {
187+
.directive('ionInfiniteScroll', ['$ionicBind', function($ionicBind) {
222188
return {
223189
restrict: 'E',
224-
replace: false,
225-
template: '<div class="scroll-infinite"><div class="scroll-infinite-content"><i class="icon ion-loading-d icon-refreshing"></i></div></div>'
190+
require: '^?$ionicScroll',
191+
template:
192+
'<div class="scroll-infinite">' +
193+
'<div class="scroll-infinite-content">' +
194+
'<i class="icon ion-loading-d icon-refreshing"></i>' +
195+
'</div>' +
196+
'</div>',
197+
link: function($scope, $element, $attrs, scrollCtrl) {
198+
setTimeout(function() {
199+
var scrollCtrl = $element.controller('$ionicScroll');
200+
var scrollView = scrollCtrl.scrollView;
201+
202+
$ionicBind($scope, $attrs, {
203+
distance: '@infiniteScrollDistance'
204+
});
205+
function maxScroll() {
206+
var dist = $scope.distance || '1%';
207+
return dist.indexOf('%') > -1 ?
208+
scrollView.getScrollMax().top * (1 - parseInt(dist,10) / 100) :
209+
scrollView.getScrollMax().top - parseInt(dist, 10);
210+
}
211+
212+
var infiniteScrolling = false;
213+
$scope.$on('scroll.infiniteScrollComplete', function() {
214+
$element[0].classList.remove('active');
215+
setTimeout(function() {
216+
scrollView.resize();
217+
});
218+
infiniteScrolling = false;
219+
});
220+
221+
scrollCtrl.$element.on('scroll', ionic.animationFrameThrottle(function() {
222+
if (!infiniteScrolling && scrollView.getValues().top >= maxScroll()) {
223+
$element[0].classList.add('active');
224+
infiniteScrolling = true;
225+
$scope.$apply(angular.bind($scope, $scope.$onInfiniteScroll));
226+
}
227+
}));
228+
});
229+
}
226230
};
227-
});
231+
}]);
228232

229233
})();

js/ext/angular/test/list-fit.html

+7-3
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,13 @@ <h1 class="title">Footer!</h1>
6565
};
6666
$scope.more = [];
6767
$scope.addMore = function() {
68-
for (var i=0; i<15; i++) {
69-
$scope.more.push(i);
70-
}
68+
$timeout(function() {
69+
var l = $scope.more.length;
70+
for (var i=l; i<l+15; i++) {
71+
$scope.more.push(i);
72+
}
73+
$scope.$broadcast('scroll.infiniteScrollComplete');
74+
}, 1500);
7175
};
7276
}
7377
</script>

0 commit comments

Comments
 (0)