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