1
1
/*!
2
2
* angular-ui-scroll
3
3
* https://github.com/angular-ui/ui-scroll.git
4
- * Version: 1.3.3 -- 2016-03-17T12:18:01.421Z
4
+ * Version: 1.3.3 -- 2016-03-19T16:35:39.854Z
5
5
* License: MIT
6
6
*/
7
7
@@ -106,6 +106,30 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
106
106
} ) ] ;
107
107
}
108
108
109
+ function Cache ( ) {
110
+ var cache = Object . create ( Array . prototype ) ;
111
+
112
+ angular . extend ( cache , {
113
+ add : function add ( item ) {
114
+ for ( var i = cache . length - 1 ; i >= 0 ; i -- ) {
115
+ if ( cache [ i ] . index === item . scope . $index ) {
116
+ cache [ i ] . height = item . element . outerHeight ( ) ;
117
+ return ;
118
+ }
119
+ }
120
+ cache . push ( {
121
+ index : item . scope . $index ,
122
+ height : item . element . outerHeight ( )
123
+ } ) ;
124
+ } ,
125
+ clear : function clear ( ) {
126
+ cache . length = 0 ;
127
+ }
128
+ } ) ;
129
+
130
+ return cache ;
131
+ }
132
+
109
133
function Buffer ( itemName , $scope , linker , bufferSize ) {
110
134
var buffer = Object . create ( Array . prototype ) ;
111
135
@@ -215,7 +239,7 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
215
239
return buffer ;
216
240
}
217
241
218
- function Viewport ( buffer , element , controllers , attrs ) {
242
+ function Viewport ( buffer , cache , element , controllers , attrs ) {
219
243
var PADDING_MIN = 0.3 ;
220
244
var PADDING_DEFAULT = 0.5 ;
221
245
var topPadding = null ;
@@ -297,6 +321,7 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
297
321
if ( buffer [ i ] . element . offset ( ) . top - viewportOffset ( ) . top <= viewport . outerHeight ( ) + bufferPadding ( ) ) {
298
322
break ;
299
323
}
324
+ cache . add ( buffer [ i ] ) ;
300
325
overage ++ ;
301
326
}
302
327
@@ -319,6 +344,7 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
319
344
if ( buffer [ i ] . element . offset ( ) . top - viewportOffset ( ) . top + buffer [ i ] . element . outerHeight ( true ) >= - 1 * bufferPadding ( ) ) {
320
345
break ;
321
346
}
347
+ cache . add ( buffer [ i ] ) ;
322
348
overageHeight += buffer [ i ] . element . outerHeight ( true ) ;
323
349
overage ++ ;
324
350
}
@@ -333,23 +359,33 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
333
359
}
334
360
} ,
335
361
adjustPadding : function adjustPadding ( ) {
336
- if ( ! buffer . length ) {
362
+ if ( ! buffer . length || ! cache . length ) {
337
363
return ;
338
364
}
339
365
340
- var bufferFirstEl = buffer [ 0 ] . element ;
341
- var bufferLastEl = buffer [ buffer . length - 1 ] . element ;
342
-
343
- averageItemHeight = ( bufferLastEl . offset ( ) . top + bufferLastEl . outerHeight ( true ) - bufferFirstEl . offset ( ) . top ) / buffer . length ;
344
- topPadding . height ( ( buffer . first - buffer . minIndex ) * averageItemHeight ) ;
366
+ var topPaddingHeight = 0 ;
367
+ var bottomPaddingHeight = 0 ;
368
+ for ( var i = cache . length - 1 ; i >= 0 ; i -- ) {
369
+ if ( cache [ i ] . index < buffer . first ) {
370
+ topPaddingHeight += cache [ i ] . height ;
371
+ }
372
+ if ( cache [ i ] . index >= buffer . next ) {
373
+ bottomPaddingHeight += cache [ i ] . height ;
374
+ }
375
+ }
345
376
346
- return bottomPadding . height ( ( buffer . maxIndex - buffer . next + 1 ) * averageItemHeight ) ;
377
+ topPadding . height ( topPaddingHeight ) ;
378
+ bottomPadding . height ( bottomPaddingHeight ) ;
347
379
} ,
348
380
syncDatasource : function syncDatasource ( datasource ) {
349
381
if ( ! buffer . length ) {
350
382
return ;
351
383
}
352
384
385
+ var bufferFirstEl = buffer [ 0 ] . element ;
386
+ var bufferLastEl = buffer [ buffer . length - 1 ] . element ;
387
+ averageItemHeight = ( bufferLastEl . offset ( ) . top + bufferLastEl . outerHeight ( true ) - bufferFirstEl . offset ( ) . top ) / buffer . length ;
388
+
353
389
var delta = buffer . syncDatasource ( datasource ) * averageItemHeight ;
354
390
355
391
topPadding . height ( topPadding . height ( ) + delta ) ;
@@ -517,8 +553,9 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
517
553
518
554
var ridActual = 0 ; // current data revision id
519
555
var pending = [ ] ;
556
+ var cache = new Cache ( ) ;
520
557
var buffer = new Buffer ( itemName , $scope , linker , bufferSize ) ;
521
- var viewport = new Viewport ( buffer , element , controllers , $attr ) ;
558
+ var viewport = new Viewport ( buffer , cache , element , controllers , $attr ) ;
522
559
var adapter = new Adapter ( $attr , viewport , buffer , function ( ) {
523
560
dismissPendingRequests ( ) ;
524
561
return adjustBuffer ( ridActual ) ;
@@ -649,6 +686,7 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
649
686
} else {
650
687
buffer . clear ( ) ;
651
688
}
689
+ cache . clear ( ) ;
652
690
653
691
return adjustBuffer ( ridActual ) ;
654
692
}
0 commit comments