@@ -90,30 +90,6 @@ angular.module('ui.scroll', [])
90
90
return [ ( $animate . leave ( wrapper . element ) ) . then ( ( ) => wrapper . scope . $destroy ( ) ) ] ;
91
91
}
92
92
93
- function Cache ( ) {
94
- const cache = Object . create ( Array . prototype ) ;
95
-
96
- angular . extend ( cache , {
97
- add ( item ) {
98
- for ( let i = cache . length - 1 ; i >= 0 ; i -- ) {
99
- if ( cache [ i ] . index === item . scope . $index ) {
100
- cache [ i ] . height = item . element . outerHeight ( ) ;
101
- return ;
102
- }
103
- }
104
- cache . push ( {
105
- index : item . scope . $index ,
106
- height : item . element . outerHeight ( )
107
- } ) ;
108
- } ,
109
- clear ( ) {
110
- cache . length = 0 ;
111
- }
112
- } ) ;
113
-
114
- return cache ;
115
- }
116
-
117
93
function Buffer ( itemName , $scope , linker , bufferSize ) {
118
94
const buffer = Object . create ( Array . prototype ) ;
119
95
@@ -214,7 +190,7 @@ angular.module('ui.scroll', [])
214
190
return buffer ;
215
191
}
216
192
217
- function Viewport ( buffer , cache , element , controllers , attrs ) {
193
+ function Viewport ( buffer , element , controllers , attrs ) {
218
194
const PADDING_MIN = 0.3 ;
219
195
const PADDING_DEFAULT = 0.5 ;
220
196
let topPadding = null ;
@@ -228,6 +204,52 @@ angular.module('ui.scroll', [])
228
204
229
205
let viewportOffset = viewport . offset ( ) ? ( ) => viewport . offset ( ) : ( ) => ( { top : 0 } ) ;
230
206
207
+ function Cache ( ) {
208
+ const cache = Object . create ( Array . prototype ) ;
209
+
210
+ angular . extend ( cache , {
211
+ add ( item ) {
212
+ for ( let i = cache . length - 1 ; i >= 0 ; i -- ) {
213
+ if ( cache [ i ] . index === item . scope . $index ) {
214
+ cache [ i ] . height = item . element . outerHeight ( ) ;
215
+ return ;
216
+ }
217
+ }
218
+ cache . push ( {
219
+ index : item . scope . $index ,
220
+ height : item . element . outerHeight ( )
221
+ } ) ;
222
+ } ,
223
+ clear ( ) {
224
+ cache . length = 0 ;
225
+ }
226
+ } ) ;
227
+
228
+ return cache ;
229
+ }
230
+
231
+ function Padding ( template ) {
232
+ let result ;
233
+
234
+ switch ( template . tagName ) {
235
+ case 'dl' :
236
+ throw new Error ( `ui-scroll directive does not support <${ template . tagName } > as a repeating tag: ${ template . outerHTML } ` ) ;
237
+ case 'tr' :
238
+ let table = angular . element ( '<table><tr><td><div></div></td></tr></table>' ) ;
239
+ result = table . find ( 'tr' ) ;
240
+ break ;
241
+ case 'li' :
242
+ result = angular . element ( '<li></li>' ) ;
243
+ break ;
244
+ default :
245
+ result = angular . element ( '<div></div>' ) ;
246
+ }
247
+
248
+ result . cache = new Cache ( ) ;
249
+
250
+ return result ;
251
+ }
252
+
231
253
function bufferPadding ( ) {
232
254
return viewport . outerHeight ( ) * Math . max ( PADDING_MIN , + attrs . padding || PADDING_DEFAULT ) ; // some extra space to initiate preload
233
255
}
@@ -238,27 +260,6 @@ angular.module('ui.scroll', [])
238
260
bottomPadding = new Padding ( template ) ;
239
261
element . before ( topPadding ) ;
240
262
element . after ( bottomPadding ) ;
241
-
242
- function Padding ( template ) {
243
- let result ;
244
- let tagName = template . localName ;
245
-
246
- switch ( tagName ) {
247
- case 'dl' :
248
- throw new Error ( `ui-scroll directive does not support <${ tagName } > as a repeating tag: ${ template . outerHTML } ` ) ;
249
- case 'tr' :
250
- let table = angular . element ( '<table><tr><td><div></div></td></tr></table>' ) ;
251
- result = table . find ( 'tr' ) ;
252
- break ;
253
- case 'li' :
254
- result = angular . element ( '<li></li>' ) ;
255
- break ;
256
- default :
257
- result = angular . element ( '<div></div>' ) ;
258
- }
259
-
260
- return result ;
261
- }
262
263
} ,
263
264
264
265
bottomDataPos ( ) {
@@ -299,7 +300,7 @@ angular.module('ui.scroll', [])
299
300
if ( buffer [ i ] . element . offset ( ) . top - viewportOffset ( ) . top <= viewport . outerHeight ( ) + bufferPadding ( ) ) {
300
301
break ;
301
302
}
302
- cache . add ( buffer [ i ] ) ;
303
+ bottomPadding . cache . add ( buffer [ i ] ) ;
303
304
overage ++ ;
304
305
}
305
306
@@ -324,7 +325,7 @@ angular.module('ui.scroll', [])
324
325
if ( buffer [ i ] . element . offset ( ) . top - viewportOffset ( ) . top + buffer [ i ] . element . outerHeight ( true ) >= ( - 1 ) * bufferPadding ( ) ) {
325
326
break ;
326
327
}
327
- cache . add ( buffer [ i ] ) ;
328
+ topPadding . cache . add ( buffer [ i ] ) ;
328
329
overageHeight += buffer [ i ] . element . outerHeight ( true ) ;
329
330
overage ++ ;
330
331
}
@@ -348,13 +349,17 @@ angular.module('ui.scroll', [])
348
349
let topPaddingHeight = 0 ;
349
350
let bottomPaddingHeight = 0 ;
350
351
351
- if ( cache . length ) {
352
- for ( let i = cache . length - 1 ; i >= 0 ; i -- ) {
353
- if ( cache [ i ] . index < buffer . first ) {
354
- topPaddingHeight += cache [ i ] . height ;
352
+ if ( topPadding . cache . length ) {
353
+ for ( let i = topPadding . cache . length - 1 ; i >= 0 ; i -- ) {
354
+ if ( topPadding . cache [ i ] . index < buffer . first ) {
355
+ topPaddingHeight += topPadding . cache [ i ] . height ;
355
356
}
356
- if ( cache [ i ] . index >= buffer . next ) {
357
- bottomPaddingHeight += cache [ i ] . height ;
357
+ }
358
+ }
359
+ if ( bottomPadding . cache . length ) {
360
+ for ( let i = bottomPadding . cache . length - 1 ; i >= 0 ; i -- ) {
361
+ if ( bottomPadding . cache [ i ] . index >= buffer . next ) {
362
+ bottomPaddingHeight += bottomPadding . cache [ i ] . height ;
358
363
}
359
364
}
360
365
}
@@ -397,11 +402,13 @@ angular.module('ui.scroll', [])
397
402
viewport . scrollTop ( viewport . scrollTop ( ) - paddingHeight ) ;
398
403
}
399
404
} ,
400
- resetTopPaddingHeight ( ) {
405
+ resetTopPadding ( ) {
401
406
topPadding . height ( 0 ) ;
407
+ topPadding . cache . clear ( ) ;
402
408
} ,
403
- resetBottomPaddingHeight ( ) {
409
+ resetBottomPadding ( ) {
404
410
bottomPadding . height ( 0 ) ;
411
+ bottomPadding . cache . clear ( ) ;
405
412
}
406
413
} ) ;
407
414
@@ -559,9 +566,8 @@ angular.module('ui.scroll', [])
559
566
560
567
let ridActual = 0 ; // current data revision id
561
568
let pending = [ ] ;
562
- let cache = new Cache ( ) ;
563
569
let buffer = new Buffer ( itemName , $scope , linker , bufferSize ) ;
564
- let viewport = new Viewport ( buffer , cache , element , controllers , $attr ) ;
570
+ let viewport = new Viewport ( buffer , element , controllers , $attr ) ;
565
571
let adapter = new Adapter ( $attr , viewport , buffer , ( ) => {
566
572
dismissPendingRequests ( ) ;
567
573
return adjustBuffer ( ridActual ) ;
@@ -687,8 +693,8 @@ angular.module('ui.scroll', [])
687
693
function reload ( ) {
688
694
dismissPendingRequests ( ) ;
689
695
690
- viewport . resetTopPaddingHeight ( ) ;
691
- viewport . resetBottomPaddingHeight ( ) ;
696
+ viewport . resetTopPadding ( ) ;
697
+ viewport . resetBottomPadding ( ) ;
692
698
693
699
adapter . abCount = 0 ;
694
700
adapter . abfCount = 0 ;
@@ -699,7 +705,6 @@ angular.module('ui.scroll', [])
699
705
} else {
700
706
buffer . clear ( ) ;
701
707
}
702
- cache . clear ( ) ;
703
708
704
709
return adjustBuffer ( ridActual ) ;
705
710
}
0 commit comments