Skip to content

Commit 646decc

Browse files
committed
paddings cache refactoring
1 parent a7d2245 commit 646decc

File tree

1 file changed

+66
-61
lines changed

1 file changed

+66
-61
lines changed

src/ui-scroll.js

Lines changed: 66 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -90,30 +90,6 @@ angular.module('ui.scroll', [])
9090
return [($animate.leave(wrapper.element)).then(() => wrapper.scope.$destroy())];
9191
}
9292

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-
11793
function Buffer(itemName, $scope, linker, bufferSize) {
11894
const buffer = Object.create(Array.prototype);
11995

@@ -214,7 +190,7 @@ angular.module('ui.scroll', [])
214190
return buffer;
215191
}
216192

217-
function Viewport(buffer, cache, element, controllers, attrs) {
193+
function Viewport(buffer, element, controllers, attrs) {
218194
const PADDING_MIN = 0.3;
219195
const PADDING_DEFAULT = 0.5;
220196
let topPadding = null;
@@ -228,6 +204,52 @@ angular.module('ui.scroll', [])
228204

229205
let viewportOffset = viewport.offset() ? () => viewport.offset() : () => ({top: 0});
230206

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+
231253
function bufferPadding() {
232254
return viewport.outerHeight() * Math.max(PADDING_MIN, +attrs.padding || PADDING_DEFAULT); // some extra space to initiate preload
233255
}
@@ -238,27 +260,6 @@ angular.module('ui.scroll', [])
238260
bottomPadding = new Padding(template);
239261
element.before(topPadding);
240262
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-
}
262263
},
263264

264265
bottomDataPos() {
@@ -299,7 +300,7 @@ angular.module('ui.scroll', [])
299300
if (buffer[i].element.offset().top - viewportOffset().top <= viewport.outerHeight() + bufferPadding()) {
300301
break;
301302
}
302-
cache.add(buffer[i]);
303+
bottomPadding.cache.add(buffer[i]);
303304
overage++;
304305
}
305306

@@ -324,7 +325,7 @@ angular.module('ui.scroll', [])
324325
if (buffer[i].element.offset().top - viewportOffset().top + buffer[i].element.outerHeight(true) >= (-1) * bufferPadding()) {
325326
break;
326327
}
327-
cache.add(buffer[i]);
328+
topPadding.cache.add(buffer[i]);
328329
overageHeight += buffer[i].element.outerHeight(true);
329330
overage++;
330331
}
@@ -348,13 +349,17 @@ angular.module('ui.scroll', [])
348349
let topPaddingHeight = 0;
349350
let bottomPaddingHeight = 0;
350351

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;
355356
}
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;
358363
}
359364
}
360365
}
@@ -397,11 +402,13 @@ angular.module('ui.scroll', [])
397402
viewport.scrollTop(viewport.scrollTop() - paddingHeight);
398403
}
399404
},
400-
resetTopPaddingHeight() {
405+
resetTopPadding() {
401406
topPadding.height(0);
407+
topPadding.cache.clear();
402408
},
403-
resetBottomPaddingHeight() {
409+
resetBottomPadding() {
404410
bottomPadding.height(0);
411+
bottomPadding.cache.clear();
405412
}
406413
});
407414

@@ -559,9 +566,8 @@ angular.module('ui.scroll', [])
559566

560567
let ridActual = 0;// current data revision id
561568
let pending = [];
562-
let cache = new Cache();
563569
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);
565571
let adapter = new Adapter($attr, viewport, buffer, () => {
566572
dismissPendingRequests();
567573
return adjustBuffer(ridActual);
@@ -687,8 +693,8 @@ angular.module('ui.scroll', [])
687693
function reload() {
688694
dismissPendingRequests();
689695

690-
viewport.resetTopPaddingHeight();
691-
viewport.resetBottomPaddingHeight();
696+
viewport.resetTopPadding();
697+
viewport.resetBottomPadding();
692698

693699
adapter.abCount = 0;
694700
adapter.abfCount = 0;
@@ -699,7 +705,6 @@ angular.module('ui.scroll', [])
699705
} else {
700706
buffer.clear();
701707
}
702-
cache.clear();
703708

704709
return adjustBuffer(ridActual);
705710
}

0 commit comments

Comments
 (0)