@@ -96,48 +96,65 @@ angular.module('ui.scroll', [])
96
96
}
97
97
}
98
98
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 ) {
100
117
let descriptor = Object . getOwnPropertyDescriptor ( datasource , propName ) ;
101
118
if ( descriptor && ( descriptor . set || descriptor . get ) ) {
102
119
return ;
103
120
}
104
121
let getter ;
122
+ preDefineIndexProperty ( datasource , propName ) ;
105
123
Object . defineProperty ( datasource , propName , {
106
124
set : ( value ) => {
107
125
getter = value ;
108
126
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 ( ) ) ;
115
130
}
116
131
} ,
117
132
get : ( ) => getter
118
133
} ) ;
119
134
}
120
135
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
+ } ;
141
158
142
159
/**
143
160
* Build padding elements
@@ -292,11 +309,11 @@ angular.module('ui.scroll', [])
292
309
// schedule another adjustBuffer after animation completion
293
310
if ( updates . animated . length ) {
294
311
$q . all ( updates . animated ) . then ( ( ) => {
295
- viewport . adjustPadding ( ) ;
312
+ viewport . adjustPaddings ( ) ;
296
313
adjustBuffer ( rid ) ;
297
314
} ) ;
298
315
} else {
299
- viewport . adjustPadding ( ) ;
316
+ viewport . adjustPaddings ( ) ;
300
317
}
301
318
}
302
319
@@ -357,13 +374,14 @@ angular.module('ui.scroll', [])
357
374
updates . inserted . forEach ( w => w . element . removeClass ( 'ng-hide' ) ) ;
358
375
updates . prepended . forEach ( w => w . element . removeClass ( 'ng-hide' ) ) ;
359
376
360
- viewport . adjustScrollTopAfterPrepend ( updates ) ;
377
+ viewport . onAfterPrepend ( updates ) ;
361
378
362
379
if ( isInvalid ( rid ) ) {
363
380
return ;
364
381
}
365
382
366
383
updatePaddings ( rid , updates ) ;
384
+ onRenderHandlersRunner ( ) ;
367
385
enqueueFetch ( rid , updates ) ;
368
386
pending . shift ( ) ;
369
387
0 commit comments