Skip to content

Commit 53a9208

Browse files
authored
Merge pull request #181 from angular-ui/min-index
Min index early set
2 parents 09f679c + 4514c69 commit 53a9208

File tree

11 files changed

+430
-316
lines changed

11 files changed

+430
-316
lines changed

dist/ui-scroll.js

Lines changed: 59 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/ui-scroll.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/ui-scroll.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/ui-scroll.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/modules/padding.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ function Cache() {
4141
export default function Padding(template) {
4242
let result;
4343

44+
if(template.nodeType !== Node.ELEMENT_NODE) {
45+
throw new Error('ui-scroll directive requires an Element node for templating the view');
46+
}
47+
4448
switch (template.tagName.toLowerCase()) {
4549
case 'dl':
4650
throw new Error(`ui-scroll directive does not support <${template.tagName}> as a repeating tag: ${template.outerHTML}`);

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: 59 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -96,48 +96,66 @@ angular.module('ui.scroll', [])
9696
}
9797
}
9898

99-
let indexStore = {};
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+
}
100115

101-
function defineProperty(datasource, propName, propUserName) {
116+
function defineIndexProperty(datasource, propName, propUserName) {
102117
let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);
103-
if (!descriptor || (!descriptor.set && !descriptor.get)) {
104-
Object.defineProperty(datasource, propName, {
105-
set: (value) => {
106-
indexStore[propName] = value;
107-
buffer[propUserName] = value;
108-
if (!pending.length) {
109-
let topPaddingHeightOld = viewport.topDataPos();
110-
viewport.adjustPadding();
111-
if (propName === 'minIndex') {
112-
viewport.adjustScrollTopAfterMinIndexSet(topPaddingHeightOld);
113-
}
114-
}
115-
},
116-
get: () => indexStore[propName]
117-
});
118+
if (descriptor && (descriptor.set || descriptor.get)) {
119+
return;
118120
}
121+
let getter;
122+
preDefineIndexProperty(datasource, propName);
123+
Object.defineProperty(datasource, propName, {
124+
set: (value) => {
125+
getter = value;
126+
buffer[propUserName] = value;
127+
let topPaddingHeightOld = viewport.topDataPos();
128+
viewport.adjustPaddings();
129+
if (propName === 'minIndex') {
130+
viewport.onAfterMinIndexSet(topPaddingHeightOld);
131+
}
132+
},
133+
get: () => getter
134+
});
119135
}
120136

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-
};
137+
defineIndexProperty(datasource, 'minIndex', 'minIndexUser');
138+
defineIndexProperty(datasource, 'maxIndex', 'maxIndexUser');
139+
140+
const fetchNext = (datasource.get.length !== 2) ?
141+
(success) => datasource.get(buffer.next, bufferSize, success) :
142+
(success) => {
143+
datasource.get({
144+
index: buffer.next,
145+
append: buffer.length ? buffer[buffer.length - 1].item : void 0,
146+
count: bufferSize
147+
}, success);
148+
};
149+
150+
const fetchPrevious = (datasource.get.length !== 2) ?
151+
(success) => datasource.get(buffer.first - bufferSize, bufferSize, success) :
152+
(success) => {
153+
datasource.get({
154+
index: buffer.first - bufferSize,
155+
prepend: buffer.length ? buffer[0].item : void 0,
156+
count: bufferSize
157+
}, success);
158+
};
141159

142160
/**
143161
* Build padding elements
@@ -292,11 +310,11 @@ angular.module('ui.scroll', [])
292310
// schedule another adjustBuffer after animation completion
293311
if (updates.animated.length) {
294312
$q.all(updates.animated).then(() => {
295-
viewport.adjustPadding();
313+
viewport.adjustPaddings();
296314
adjustBuffer(rid);
297315
});
298316
} else {
299-
viewport.adjustPadding();
317+
viewport.adjustPaddings();
300318
}
301319
}
302320

@@ -357,13 +375,14 @@ angular.module('ui.scroll', [])
357375
updates.inserted.forEach(w => w.element.removeClass('ng-hide'));
358376
updates.prepended.forEach(w => w.element.removeClass('ng-hide'));
359377

360-
viewport.adjustScrollTopAfterPrepend(updates);
378+
viewport.onAfterPrepend(updates);
361379

362380
if (isInvalid(rid)) {
363381
return;
364382
}
365383

366384
updatePaddings(rid, updates);
385+
onRenderHandlersRunner();
367386
enqueueFetch(rid, updates);
368387
pending.shift();
369388

0 commit comments

Comments
 (0)