@@ -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 = 50 ;
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,26 @@ 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+ $interval . cancel ( timer ) ;
174+ throw Error ( `ui-scroll directive requires a viewport with non-zero height in ${ MAX_VIEWPORT_DELAY } ms` ) ;
175+ }
176+ } , VIEWPORT_POLLING_INTERVAL ) ;
177+ }
178+ else {
179+ reload ( ) ;
180+ }
181+ } ;
182+
160183 /**
161184 * Build padding elements
162185 *
@@ -180,10 +203,7 @@ angular.module('ui.scroll', [])
180203
181204 viewport . bind ( 'mousewheel' , wheelHandler ) ;
182205
183- $timeout ( ( ) => {
184- viewport . applyContainerStyle ( ) ;
185- reload ( ) ;
186- } ) ;
206+ run ( ) ;
187207
188208 /* Private function definitions */
189209
@@ -239,7 +259,7 @@ angular.module('ui.scroll', [])
239259
240260 function createElement ( wrapper , insertAfter , insertElement ) {
241261 let promises = null ;
242- let sibling = ( insertAfter > 0 ) ? buffer [ insertAfter - 1 ] . element : undefined ;
262+ const sibling = ( insertAfter > 0 ) ? buffer [ insertAfter - 1 ] . element : undefined ;
243263 linker ( ( clone , scope ) => {
244264 promises = insertElement ( clone , sibling ) ;
245265 wrapper . element = clone ;
@@ -248,7 +268,7 @@ angular.module('ui.scroll', [])
248268 } ) ;
249269 // ui-scroll-grid apply
250270 if ( adapter . transform ) {
251- let tdInitializer = wrapper . scope . uiScrollTdInitializer ;
271+ const tdInitializer = wrapper . scope . uiScrollTdInitializer ;
252272 if ( tdInitializer && tdInitializer . linking ) {
253273 adapter . transform ( wrapper . scope , wrapper . element ) ;
254274 } else {
@@ -459,8 +479,8 @@ angular.module('ui.scroll', [])
459479
460480 function wheelHandler ( event ) {
461481 if ( ! adapter . disabled ) {
462- let scrollTop = viewport [ 0 ] . scrollTop ;
463- let yMax = viewport [ 0 ] . scrollHeight - viewport [ 0 ] . clientHeight ;
482+ const scrollTop = viewport [ 0 ] . scrollTop ;
483+ const yMax = viewport [ 0 ] . scrollHeight - viewport [ 0 ] . clientHeight ;
464484
465485 if ( ( scrollTop === 0 && ! buffer . bof ) || ( scrollTop === yMax && ! buffer . eof ) ) {
466486 event . preventDefault ( ) ;
0 commit comments