@@ -73,6 +73,9 @@ angular.module('ui.scroll', [])
73
73
74
74
buffer = Object .create Array .prototype
75
75
76
+ # starting index for initial load
77
+ origin = 1
78
+
76
79
buffer .size = bufferSize
77
80
78
81
# inserts wrapped element in the buffer
@@ -113,17 +116,35 @@ angular.module('ui.scroll', [])
113
116
reset = ->
114
117
buffer .eof = false
115
118
buffer .bof = false
116
- buffer .first = 1
117
- buffer .next = 1
119
+ buffer .first = origin
120
+ buffer .next = origin
121
+ buffer .localMinIndex = origin
118
122
119
123
# clears the buffer
120
124
buffer .clear = ->
121
125
buffer .remove (0 , buffer .length )
122
126
reset ()
123
127
124
128
reset ()
125
- buffer .minIndex = -> datasource .minIndex || 1
126
- buffer .maxIndex = -> datasource .maxIndex || 1
129
+
130
+ buffer .minIndex = (value ) ->
131
+ # console.log "before ds #{datasource.minIndex} local #{buffer.localMinIndex}"
132
+ if arguments .length
133
+ if buffer .bof
134
+ datasource .minIndex = value
135
+ else
136
+ datasource .minIndex = Math .min value, datasource .minIndex || Number .MAX_VALUE
137
+ buffer .localMinIndex = datasource .minIndex
138
+ # console.log "after ds #{datasource.minIndex} local #{buffer.localMinIndex}"
139
+ else
140
+ offset = buffer .localMinIndex - (datasource .minIndex || origin)
141
+ buffer .localMinIndex -= offset
142
+ # console.log "after ds #{datasource.minIndex} local #{buffer.localMinIndex} , #{offset}"
143
+ offset : offset
144
+ value : buffer .localMinIndex
145
+
146
+ buffer .maxIndex = -> datasource .maxIndex || origin
147
+
127
148
buffer
128
149
129
150
Padding = (template ) ->
@@ -177,7 +198,7 @@ angular.module('ui.scroll', [])
177
198
viewport .clipBottom = ->
178
199
# clip the invisible items off the bottom
179
200
overage = 0
180
- calculateAverageItemHeight ()
201
+ # calculateAverageItemHeight()
181
202
overageBottom = viewport .outerHeight () + viewport .averageItemHeight * (buffer .size )
182
203
for i in [buffer .length - 1 .. 0 ]
183
204
item = buffer[i]
@@ -196,7 +217,7 @@ angular.module('ui.scroll', [])
196
217
# clip the invisible items off the top
197
218
overage = 0
198
219
heightIncrement = 0
199
- calculateAverageItemHeight ()
220
+ # calculateAverageItemHeight()
200
221
overageTop = (- 1 ) * viewport .averageItemHeight * buffer .size
201
222
for item in buffer
202
223
if item .element .offset ().top < overageTop
@@ -214,11 +235,15 @@ angular.module('ui.scroll', [])
214
235
viewport .averageItemHeight = (buffer[buffer .length - 1 ].element .offset ().top +
215
236
buffer[buffer .length - 1 ].element .outerHeight (true ) -
216
237
buffer[0 ].element .offset ().top ) / buffer .length
238
+ console .log " avg #{ viewport .averageItemHeight } "
217
239
218
240
viewport .adjustPadding = () ->
219
241
return if not buffer .length
220
242
calculateAverageItemHeight ()
221
- topPadding .height (buffer .first - buffer .minIndex ()) * viewport .averageItemHeight
243
+ minIndex = buffer .minIndex ()
244
+ # console.log "offs #{minIndex.offset}"
245
+ viewport .adjustScrollTop (minIndex .offset * viewport .averageItemHeight )
246
+ topPadding .height (buffer .first - minIndex .value ) * viewport .averageItemHeight
222
247
bottomPadding .height (buffer .maxIndex () - buffer .next + 1 ) * viewport .averageItemHeight
223
248
224
249
viewport .adjustScrollTop = (height ) ->
@@ -433,13 +458,14 @@ angular.module('ui.scroll', [])
433
458
# re-index the buffer
434
459
item .scope .$index = buffer .first + i for item,i in buffer
435
460
436
- viewport .adjustPadding ()
437
-
438
461
# schedule another adjustBuffer after animation completion
439
462
if (promises .length )
440
463
$q .all (promises).then ->
464
+ viewport .adjustPadding ()
441
465
# log "Animation completed rid #{rid}"
442
466
adjustBuffer rid
467
+ else
468
+ viewport .adjustPadding ()
443
469
444
470
keepFetching
445
471
@@ -514,10 +540,7 @@ angular.module('ui.scroll', [])
514
540
-- buffer .first
515
541
buffer .insert ' prepend' , result[i]
516
542
# log 'prepended: requested ' + bufferSize + ' received ' + result.length + ' buffer size ' + buffer.length + ' first ' + first + ' next ' + next
517
- if buffer .bof
518
- datasource .minIndex = buffer .first
519
- else
520
- datasource .minIndex = Math .min buffer .first , datasource .minIndex || Number .MAX_VALUE
543
+ buffer .minIndex buffer .first
521
544
adjustBufferAfterFetch rid
522
545
523
546
0 commit comments