@@ -87,8 +87,8 @@ function($parse, $timeout, $ionicScrollDelegate, $controller, $ionicBind) {
87
87
$onRefreshOpening : '&onRefreshOpening' ,
88
88
$onScroll : '&onScroll' ,
89
89
$onScrollComplete : '&onScrollComplete' ,
90
+ $onInfiniteScroll : '&onInfiniteScroll' ,
90
91
refreshComplete : '=' ,
91
- onInfiniteScroll : '&' ,
92
92
infiniteScrollDistance : '@' ,
93
93
hasBouncing : '@' ,
94
94
scroll : '@' ,
@@ -160,40 +160,6 @@ function($parse, $timeout, $ionicScrollDelegate, $controller, $ionicBind) {
160
160
}
161
161
} ;
162
162
}
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
- }
197
163
}
198
164
}
199
165
} ;
@@ -218,12 +184,50 @@ function($parse, $timeout, $ionicScrollDelegate, $controller, $ionicBind) {
218
184
} ;
219
185
} )
220
186
221
- . directive ( 'ionInfiniteScroll' , function ( ) {
187
+ . directive ( 'ionInfiniteScroll' , [ '$ionicBind' , function ( $ionicBind ) {
222
188
return {
223
189
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
+ }
226
230
} ;
227
- } ) ;
231
+ } ] ) ;
228
232
229
233
} ) ( ) ;
0 commit comments