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