@@ -216,6 +216,11 @@ export class RxVirtualFor<T, U extends NgIterable<T> = NgIterable<T>>
216
216
optional : true ,
217
217
} ) ;
218
218
219
+ /** @internal */
220
+ private connectedDataSource ?: DataSource < T > ;
221
+ /** @internal */
222
+ private collectionViewer ?: CollectionViewer ;
223
+
219
224
/** @internal */
220
225
private _differ ?: IterableDiffer < T > ;
221
226
@@ -237,46 +242,49 @@ export class RxVirtualFor<T, U extends NgIterable<T> = NgIterable<T>>
237
242
* [hero]="hero"></app-hero>
238
243
* </rx-virtual-scroll-viewport>
239
244
*
240
- * @param potentialSignalOrObservable
245
+ * @param potentialSignalOrObservableOrDataSource
241
246
*/
242
247
@Input ( )
243
248
set rxVirtualForOf (
244
- potentialSignalOrObservable :
249
+ potentialSignalOrObservableOrDataSource :
245
250
| Observable < ( U & NgIterable < T > ) | undefined | null >
246
251
| Signal < ( U & NgIterable < T > ) | undefined | null >
247
252
| DataSource < T >
248
253
| ( U & NgIterable < T > )
249
254
| null
250
255
| undefined ,
251
256
) {
252
- if ( isSignal ( potentialSignalOrObservable ) ) {
257
+ if ( isSignal ( potentialSignalOrObservableOrDataSource ) ) {
253
258
this . staticValue = undefined ;
254
259
this . renderStatic = false ;
255
260
this . observables$ . next (
256
- toObservable ( potentialSignalOrObservable , { injector : this . injector } ) ,
261
+ toObservable ( potentialSignalOrObservableOrDataSource , {
262
+ injector : this . injector ,
263
+ } ) ,
257
264
) ;
258
- } else if ( this . isDataSource ( potentialSignalOrObservable ) ) {
265
+ } else if ( this . isDataSource ( potentialSignalOrObservableOrDataSource ) ) {
266
+ this . disconnectDataSource ( ) ;
267
+
259
268
this . staticValue = undefined ;
260
269
this . renderStatic = false ;
261
270
262
271
const collectionViewer : CollectionViewer = {
263
272
viewChange : this . scrollStrategy . renderedRange$ ,
264
273
} ;
265
274
275
+ this . collectionViewer = collectionViewer ;
276
+ this . connectedDataSource = potentialSignalOrObservableOrDataSource ;
277
+
266
278
this . observables$ . next (
267
- potentialSignalOrObservable . connect ( collectionViewer ) ,
279
+ potentialSignalOrObservableOrDataSource . connect ( collectionViewer ) ,
268
280
) ;
269
-
270
- this . _destroy$ . pipe ( take ( 1 ) ) . subscribe ( ( ) => {
271
- potentialSignalOrObservable . disconnect ( collectionViewer ) ;
272
- } ) ;
273
- } else if ( ! isObservable ( potentialSignalOrObservable ) ) {
274
- this . staticValue = potentialSignalOrObservable ;
281
+ } else if ( ! isObservable ( potentialSignalOrObservableOrDataSource ) ) {
282
+ this . staticValue = potentialSignalOrObservableOrDataSource ;
275
283
this . renderStatic = true ;
276
284
} else {
277
285
this . staticValue = undefined ;
278
286
this . renderStatic = false ;
279
- this . observables$ . next ( potentialSignalOrObservable ) ;
287
+ this . observables$ . next ( potentialSignalOrObservableOrDataSource ) ;
280
288
}
281
289
}
282
290
@@ -290,8 +298,7 @@ export class RxVirtualFor<T, U extends NgIterable<T> = NgIterable<T>>
290
298
| undefined ,
291
299
) : value is DataSource < T > {
292
300
return (
293
- value !== null &&
294
- value !== undefined &&
301
+ value != null &&
295
302
'connect' in value &&
296
303
typeof value . connect === 'function' &&
297
304
! ( value instanceof ConnectableObservable )
@@ -677,8 +684,18 @@ export class RxVirtualFor<T, U extends NgIterable<T> = NgIterable<T>>
677
684
}
678
685
}
679
686
687
+ /** @internal */
688
+ private disconnectDataSource ( ) : void {
689
+ if ( this . connectedDataSource && this . collectionViewer ) {
690
+ this . connectedDataSource . disconnect ( this . collectionViewer ) ;
691
+ this . connectedDataSource = undefined ;
692
+ this . collectionViewer = undefined ;
693
+ }
694
+ }
695
+
680
696
/** @internal */
681
697
ngOnDestroy ( ) {
698
+ this . disconnectDataSource ( ) ;
682
699
this . _destroy$ . next ( ) ;
683
700
this . templateManager . detach ( ) ;
684
701
}
0 commit comments