Skip to content

Commit 40fe89a

Browse files
committed
ui-scroll runner: removed mandatory timeout, added occasional interval
1 parent 1362fe9 commit 40fe89a

File tree

2 files changed

+43
-18
lines changed

2 files changed

+43
-18
lines changed

src/modules/viewport.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,18 @@ export default function Viewport(elementRoutines, buffer, element, viewportContr
2727
bottomPadding = new Padding(template);
2828
element.before(topPadding.element);
2929
element.after(bottomPadding.element);
30+
topPadding.height(0);
31+
bottomPadding.height(0);
3032
},
3133

3234
applyContainerStyle() {
33-
if (container && container !== viewport) {
35+
if (!container) {
36+
return true;
37+
}
38+
if(container !== viewport) {
3439
viewport.css('height', window.getComputedStyle(container[0]).height);
3540
}
41+
return viewport.height() > 0;
3642
},
3743

3844
bottomDataPos() {

src/ui-scroll.js

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@ angular.module('ui.scroll', [])
3939
'$injector',
4040
'$rootScope',
4141
'$timeout',
42+
'$interval',
4243
'$q',
4344
'$parse',
44-
function (console, $injector, $rootScope, $timeout, $q, $parse) {
45+
function (console, $injector, $rootScope, $timeout, $interval, $q, $parse) {
4546

4647
return {
4748
require: ['?^uiScrollViewport'],
@@ -59,14 +60,16 @@ angular.module('ui.scroll', [])
5960
}
6061

6162
function parseNumericAttr(value, defaultValue) {
62-
let result = $parse(value)($scope);
63+
const result = $parse(value)($scope);
6364
return isNaN(result) ? defaultValue : result;
6465
}
6566

6667
const BUFFER_MIN = 3;
6768
const BUFFER_DEFAULT = 10;
6869
const PADDING_MIN = 0.3;
6970
const PADDING_DEFAULT = 0.5;
71+
const MAX_VIEWPORT_DELAY = 500;
72+
const VIEWPORT_POLLING_INTERVAL = 75;
7073

7174
let datasource = null;
7275
const itemName = match[1];
@@ -78,16 +81,16 @@ angular.module('ui.scroll', [])
7881
let ridActual = 0;// current data revision id
7982
let pending = [];
8083

81-
let elementRoutines = new ElementRoutines($injector, $q);
82-
let buffer = new ScrollBuffer(elementRoutines, bufferSize);
83-
let viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);
84-
let adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, $scope);
84+
const elementRoutines = new ElementRoutines($injector, $q);
85+
const buffer = new ScrollBuffer(elementRoutines, bufferSize);
86+
const viewport = new Viewport(elementRoutines, buffer, element, viewportController, $rootScope, padding);
87+
const adapter = new Adapter(viewport, buffer, adjustBuffer, reload, $attr, $parse, $scope);
8588

8689
if (viewportController) {
8790
viewportController.adapter = adapter;
8891
}
8992

90-
let isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);
93+
const isDatasourceValid = () => angular.isObject(datasource) && angular.isFunction(datasource.get);
9194
datasource = $parse(datasourceName)($scope); // try to get datasource on scope
9295
if (!isDatasourceValid()) {
9396
datasource = $injector.get(datasourceName); // try to inject datasource as service
@@ -114,7 +117,7 @@ angular.module('ui.scroll', [])
114117
}
115118

116119
function defineIndexProperty(datasource, propName, propUserName) {
117-
let descriptor = Object.getOwnPropertyDescriptor(datasource, propName);
120+
const descriptor = Object.getOwnPropertyDescriptor(datasource, propName);
118121
if (descriptor && (descriptor.set || descriptor.get)) {
119122
return;
120123
}
@@ -124,7 +127,7 @@ angular.module('ui.scroll', [])
124127
set: (value) => {
125128
getter = value;
126129
buffer[propUserName] = value;
127-
let topPaddingHeightOld = viewport.topDataPos();
130+
const topPaddingHeightOld = viewport.topDataPos();
128131
viewport.adjustPaddings();
129132
if (propName === 'minIndex') {
130133
viewport.onAfterMinIndexSet(topPaddingHeightOld);
@@ -157,6 +160,25 @@ angular.module('ui.scroll', [])
157160
}, success);
158161
};
159162

163+
const run = () => {
164+
let tryCount = 0;
165+
if(!viewport.applyContainerStyle()) {
166+
const timer = $interval(() => {
167+
tryCount++;
168+
if(viewport.applyContainerStyle()) {
169+
$interval.cancel(timer);
170+
reload();
171+
}
172+
if(tryCount * VIEWPORT_POLLING_INTERVAL >= MAX_VIEWPORT_DELAY) {
173+
throw Error(`ui-scroll directive requires a viewport with non-zero height in ${MAX_VIEWPORT_DELAY}ms`);
174+
}
175+
}, VIEWPORT_POLLING_INTERVAL);
176+
}
177+
else {
178+
reload();
179+
}
180+
};
181+
160182
/**
161183
* Build padding elements
162184
*
@@ -180,10 +202,7 @@ angular.module('ui.scroll', [])
180202

181203
viewport.bind('mousewheel', wheelHandler);
182204

183-
$timeout(() => {
184-
viewport.applyContainerStyle();
185-
reload();
186-
});
205+
run();
187206

188207
/* Private function definitions */
189208

@@ -239,7 +258,7 @@ angular.module('ui.scroll', [])
239258

240259
function createElement(wrapper, insertAfter, insertElement) {
241260
let promises = null;
242-
let sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;
261+
const sibling = (insertAfter > 0) ? buffer[insertAfter - 1].element : undefined;
243262
linker((clone, scope) => {
244263
promises = insertElement(clone, sibling);
245264
wrapper.element = clone;
@@ -248,7 +267,7 @@ angular.module('ui.scroll', [])
248267
});
249268
// ui-scroll-grid apply
250269
if (adapter.transform) {
251-
let tdInitializer = wrapper.scope.uiScrollTdInitializer;
270+
const tdInitializer = wrapper.scope.uiScrollTdInitializer;
252271
if (tdInitializer && tdInitializer.linking) {
253272
adapter.transform(wrapper.scope, wrapper.element);
254273
} else {
@@ -459,8 +478,8 @@ angular.module('ui.scroll', [])
459478

460479
function wheelHandler(event) {
461480
if (!adapter.disabled) {
462-
let scrollTop = viewport[0].scrollTop;
463-
let yMax = viewport[0].scrollHeight - viewport[0].clientHeight;
481+
const scrollTop = viewport[0].scrollTop;
482+
const yMax = viewport[0].scrollHeight - viewport[0].clientHeight;
464483

465484
if ((scrollTop === 0 && !buffer.bof) || (scrollTop === yMax && !buffer.eof)) {
466485
event.preventDefault();

0 commit comments

Comments
 (0)