@@ -72,7 +72,7 @@ angular.module('ui.scroll', [])
72
72
Buffer = (itemName , $scope , linker , bufferSize )->
73
73
74
74
buffer = Object .create Array .prototype
75
-
75
+
76
76
origin = 1 # starting index for initial load
77
77
78
78
reset = ->
@@ -175,6 +175,7 @@ angular.module('ui.scroll', [])
175
175
176
176
topPadding = null
177
177
bottomPadding = null
178
+ averageItemHeight = 0
178
179
179
180
bufferPadding = -> viewport .outerHeight () * Math .max (0.1 , + attrs .padding || 0.1 ) # some extra space to initiate preload
180
181
@@ -203,46 +204,51 @@ angular.module('ui.scroll', [])
203
204
viewport .clipBottom = ->
204
205
# clip the invisible items off the bottom
205
206
overage = 0
206
- overageBottom = viewport .bottomVisiblePos () + viewport .averageItemHeight * (buffer .size )
207
207
for i in [buffer .length - 1 .. 0 ]
208
208
item = buffer[i]
209
- if item .element .offset ().top > overageBottom
209
+ if item .element .offset ().top - viewport . offset (). top > viewport . outerHeight () + bufferPadding ()
210
210
overage++
211
211
else break
212
212
if overage > 0
213
213
buffer .eof = false
214
214
buffer .remove (buffer .length - overage, buffer .length )
215
215
buffer .next -= overage
216
+ viewport .adjustPadding ()
216
217
217
218
viewport .shouldLoadTop = ->
218
219
! buffer .bof && (viewport .topDataPos () > viewport .topVisiblePos () - bufferPadding ())
219
220
220
221
viewport .clipTop = ->
221
222
# clip the invisible items off the top
222
223
overage = 0
223
- heightIncrement = 0
224
- overageTop = viewport .topVisiblePos () - viewport .averageItemHeight * buffer .size
224
+ overageHeight = 0
225
225
for item in buffer
226
- if item .element .offset ().top < overageTop
227
- heightIncrement += item .element .outerHeight ()
226
+ if item .element .offset ().top - viewport . offset (). top + item . element . outerHeight ( true ) < ( - 1 ) * bufferPadding ()
227
+ overageHeight += item .element .outerHeight (true )
228
228
overage++
229
229
else break
230
230
if overage > 0
231
+ # we need to adjust top padding element before items are removed from top
232
+ # to avoid strange behaviour of scroll bar during remove top items when we are at the very bottom
233
+ viewport .adjustTopPaddingIntro overageHeight
231
234
buffer .bof = false
232
235
buffer .remove (0 , overage)
233
236
buffer .first += overage
234
237
235
- viewport .adjustPadding = ->
238
+ viewport .adjustTopPaddingIntro = (height ) ->
239
+ topPadding .height topPadding .height () + height
240
+
241
+ viewport .adjustPadding = () ->
236
242
return if not buffer .length
237
- viewport . averageItemHeight = (buffer[buffer .length - 1 ].element .offset ().top +
238
- buffer[buffer .length - 1 ].element .outerHeight (true ) -
243
+ averageItemHeight = (buffer[buffer .length - 1 ].element .offset ().top +
244
+ buffer[buffer .length - 1 ].element .outerHeight (true ) -
239
245
buffer[0 ].element .offset ().top ) / buffer .length
240
- topPadding .height (buffer .first - buffer .minIndex ) * viewport . averageItemHeight
241
- bottomPadding .height (buffer .maxIndex - buffer .next + 1 ) * viewport . averageItemHeight
246
+ topPadding .height (buffer .first - buffer .minIndex ) * averageItemHeight
247
+ bottomPadding .height (buffer .maxIndex - buffer .next + 1 ) * averageItemHeight
242
248
243
249
viewport .syncDatasource = (datasource ) ->
244
250
return if not buffer .length
245
- delta = buffer .syncDatasource (datasource) * viewport . averageItemHeight
251
+ delta = buffer .syncDatasource (datasource) * averageItemHeight
246
252
topPadding .height topPadding .height () + delta
247
253
viewport .scrollTop viewport .scrollTop () + delta
248
254
viewport .adjustPadding ()
0 commit comments