Skip to content

Commit 3d4b0b4

Browse files
committed
paddings precise calculation
1 parent a9045e6 commit 3d4b0b4

File tree

5 files changed

+99
-23
lines changed

5 files changed

+99
-23
lines changed

dist/ui-scroll-jqlite.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*!
22
* angular-ui-scroll
33
* 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
55
* License: MIT
66
*/
77

dist/ui-scroll-jqlite.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/ui-scroll.js

+48-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*!
22
* angular-ui-scroll
33
* 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
55
* License: MIT
66
*/
77

@@ -106,6 +106,30 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
106106
})];
107107
}
108108

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+
109133
function Buffer(itemName, $scope, linker, bufferSize) {
110134
var buffer = Object.create(Array.prototype);
111135

@@ -215,7 +239,7 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
215239
return buffer;
216240
}
217241

218-
function Viewport(buffer, element, controllers, attrs) {
242+
function Viewport(buffer, cache, element, controllers, attrs) {
219243
var PADDING_MIN = 0.3;
220244
var PADDING_DEFAULT = 0.5;
221245
var topPadding = null;
@@ -297,6 +321,7 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
297321
if (buffer[i].element.offset().top - viewportOffset().top <= viewport.outerHeight() + bufferPadding()) {
298322
break;
299323
}
324+
cache.add(buffer[i]);
300325
overage++;
301326
}
302327

@@ -319,6 +344,7 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
319344
if (buffer[i].element.offset().top - viewportOffset().top + buffer[i].element.outerHeight(true) >= -1 * bufferPadding()) {
320345
break;
321346
}
347+
cache.add(buffer[i]);
322348
overageHeight += buffer[i].element.outerHeight(true);
323349
overage++;
324350
}
@@ -333,23 +359,33 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
333359
}
334360
},
335361
adjustPadding: function adjustPadding() {
336-
if (!buffer.length) {
362+
if (!buffer.length || !cache.length) {
337363
return;
338364
}
339365

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+
}
345376

346-
return bottomPadding.height((buffer.maxIndex - buffer.next + 1) * averageItemHeight);
377+
topPadding.height(topPaddingHeight);
378+
bottomPadding.height(bottomPaddingHeight);
347379
},
348380
syncDatasource: function syncDatasource(datasource) {
349381
if (!buffer.length) {
350382
return;
351383
}
352384

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+
353389
var delta = buffer.syncDatasource(datasource) * averageItemHeight;
354390

355391
topPadding.height(topPadding.height() + delta);
@@ -517,8 +553,9 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
517553

518554
var ridActual = 0; // current data revision id
519555
var pending = [];
556+
var cache = new Cache();
520557
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);
522559
var adapter = new Adapter($attr, viewport, buffer, function () {
523560
dismissPendingRequests();
524561
return adjustBuffer(ridActual);
@@ -649,6 +686,7 @@ angular.module('ui.scroll', []).directive('uiScrollViewport', function () {
649686
} else {
650687
buffer.clear();
651688
}
689+
cache.clear();
652690

653691
return adjustBuffer(ridActual);
654692
}

0 commit comments

Comments
 (0)