Skip to content

Commit 9e8fa2a

Browse files
committed
onRenderHandlers for early min/maxIndex set
1 parent c9a657b commit 9e8fa2a

File tree

2 files changed

+57
-34
lines changed

2 files changed

+57
-34
lines changed

src/modules/viewport.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr
8686
buffer.eof = false;
8787
buffer.remove(buffer.length - overage, buffer.length);
8888
buffer.next -= overage;
89-
viewport.adjustPadding();
89+
viewport.adjustPaddings();
9090
}
9191
},
9292

@@ -121,7 +121,7 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr
121121
}
122122
},
123123

124-
adjustPadding() {
124+
adjustPaddings() {
125125
if (!buffer.length) {
126126
return;
127127
}
@@ -145,15 +145,20 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr
145145
bottomPadding.height(bottomPaddingHeight + bottomPaddingHeightAdd);
146146
},
147147

148-
adjustScrollTopAfterMinIndexSet(topPaddingHeightOld) {
148+
onAfterMinIndexSet(topPaddingHeightOld) {
149149
// additional scrollTop adjustment in case of datasource.minIndex external set
150150
if (buffer.minIndexUser !== null && buffer.minIndex > buffer.minIndexUser) {
151151
let diff = topPadding.height() - topPaddingHeightOld;
152152
viewport.scrollTop(viewport.scrollTop() + diff);
153+
diff -= viewport.scrollTop();
154+
if(diff > 0) {
155+
bottomPadding.height(bottomPadding.height() + diff);
156+
viewport.scrollTop(viewport.scrollTop() + diff);
157+
}
153158
}
154159
},
155160

156-
adjustScrollTopAfterPrepend(updates) {
161+
onAfterPrepend(updates) {
157162
if (!updates.prepended.length)
158163
return;
159164
const height = buffer.effectiveHeight(updates.prepended);

src/ui-scroll.js

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -96,48 +96,65 @@ angular.module('ui.scroll', [])
9696
}
9797
}
9898

99-
function defineProperty(datasource, propName, propUserName) {
99+
let onRenderHandlers = [];
100+
function onRenderHandlersRunner() {
101+
if(onRenderHandlers.length) {
102+
angular.forEach(onRenderHandlers, (handler) => handler());
103+
onRenderHandlers = [];
104+
}
105+
}
106+
function preDefineIndexProperty(datasource, propName) {
107+
let getter;
108+
// need to postpone min/maxIndexUser processing if the view is empty
109+
if(datasource.hasOwnProperty(propName) && !buffer.length) {
110+
getter = datasource[propName];
111+
delete datasource[propName];
112+
onRenderHandlers.push(() => datasource[propName] = getter);
113+
}
114+
}
115+
116+
function defineIndexProperty(datasource, propName, propUserName) {
100117
let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);
101118
if (descriptor && (descriptor.set || descriptor.get)) {
102119
return;
103120
}
104121
let getter;
122+
preDefineIndexProperty(datasource, propName);
105123
Object.defineProperty(datasource, propName, {
106124
set: (value) => {
107125
getter = value;
108126
buffer[propUserName] = value;
109-
if (!pending.length) {
110-
let topPaddingHeightOld = viewport.topDataPos();
111-
viewport.adjustPadding();
112-
if (propName === 'minIndex') {
113-
viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);
114-
}
127+
viewport.adjustPaddings();
128+
if (propName === 'minIndex') {
129+
viewport.onAfterMinIndexSet(viewport.topDataPos());
115130
}
116131
},
117132
get: () => getter
118133
});
119134
}
120135

121-
defineProperty(datasource, 'minIndex', 'minIndexUser');
122-
defineProperty(datasource, 'maxIndex', 'maxIndexUser');
123-
124-
const fetchNext = (datasource.get.length !== 2) ? (success) => datasource.get(buffer.next, bufferSize, success)
125-
: (success) => {
126-
datasource.get({
127-
index: buffer.next,
128-
append: buffer.length ? buffer[buffer.length - 1].item : void 0,
129-
count: bufferSize
130-
}, success);
131-
};
132-
133-
const fetchPrevious = (datasource.get.length !== 2) ? (success) => datasource.get(buffer.first - bufferSize, bufferSize, success)
134-
: (success) => {
135-
datasource.get({
136-
index: buffer.first - bufferSize,
137-
prepend: buffer.length ? buffer[0].item : void 0,
138-
count: bufferSize
139-
}, success);
140-
};
136+
defineIndexProperty(datasource, 'minIndex', 'minIndexUser');
137+
defineIndexProperty(datasource, 'maxIndex', 'maxIndexUser');
138+
139+
const fetchNext = (datasource.get.length !== 2) ?
140+
(success) => datasource.get(buffer.next, bufferSize, success) :
141+
(success) => {
142+
datasource.get({
143+
index: buffer.next,
144+
append: buffer.length ? buffer[buffer.length - 1].item : void 0,
145+
count: bufferSize
146+
}, success);
147+
};
148+
149+
const fetchPrevious = (datasource.get.length !== 2) ?
150+
(success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :
151+
(success) => {
152+
datasource.get({
153+
index: buffer.first - bufferSize,
154+
prepend: buffer.length ? buffer[0].item : void 0,
155+
count: bufferSize
156+
}, success);
157+
};
141158

142159
/**
143160
* Build padding elements
@@ -292,11 +309,11 @@ angular.module('ui.scroll', [])
292309
// schedule another adjustBuffer after animation completion
293310
if (updates.animated.length) {
294311
$q.all(updates.animated).then(() => {
295-
viewport.adjustPadding();
312+
viewport.adjustPaddings();
296313
adjustBuffer(rid);
297314
});
298315
} else {
299-
viewport.adjustPadding();
316+
viewport.adjustPaddings();
300317
}
301318
}
302319

@@ -357,13 +374,14 @@ angular.module('ui.scroll', [])
357374
updates.inserted.forEach(w => w.element.removeClass('ng-hide'));
358375
updates.prepended.forEach(w => w.element.removeClass('ng-hide'));
359376

360-
viewport.adjustScrollTopAfterPrepend(updates);
377+
viewport.onAfterPrepend(updates);
361378

362379
if (isInvalid(rid)) {
363380
return;
364381
}
365382

366383
updatePaddings(rid, updates);
384+
onRenderHandlersRunner();
367385
enqueueFetch(rid, updates);
368386
pending.shift();
369387

0 commit comments

Comments
 (0)