@@ -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