【发布时间】:2021-03-13 22:40:49
【问题描述】:
我正在构建一个屏幕,其中包含两个 Ionic segments(每个分页实体类型一个,比如“小马”和“外星人”)和一个列表。对于它们中的每一个,我必须显示一个无限列表(不是真的),并带有无限滚动。
在我的模板中,我订阅了一个名为 entities$ 的 observable,如下所示:
模板
<ng-container *ngIf="(entities$ | async) as entities">
<ng-container *ngIf="entities.length > 0; else noResult">
<ion-col>
<ion-list>
<entities-item
*ngFor="let entity of entities; trackBy: trackByFn"
[entity]="entity">
</entities-item>
</ion-list>
<ion-infinite-scroll threshold="100px" (ionInfinite)="loadMoreData($event)">
<ion-infinite-scroll-content
loadingSpinner="bubbles"
[loadingText]="'common.actions.loadingMore' | translate">
</ion-infinite-scroll-content>
</ion-infinite-scroll>
</ion-col>
</ng-container>
</ng-container>
在我的课堂上,我正在像这样构建我的可观察对象:
类
const poneys$ = this.myService.entities$.pipe(
map(entities => entities.filter(entity => entity.type === EntityType.PONEYS)),
scan((acc, poneys) => [...acc, ...poneys]),
tap(data => console.log('PONEYS')),
shareReplay(1)
);
const aliens$ = this.myService.entities$.pipe(
map(entities => entities.filter(entity => entity.type === EntityType.ALIENS)),
scan((acc, aliens) => [...acc, ...aliens]),
tap(data => console.log('ALIENS')),
shareReplay(1)
);
this.entities$ = this.segment.ionChange.pipe(
pluck('detail', 'value'),
tap(segment => this.currentSegment = segment),
startWith(this.currentSegment),
switchMap(segment => segment === EntityType.PONEYS ? poneys$ : aliens$)
);
其他详情
entities$ 来自 BehaviorSubject(asObservable 方法)。
我使用scan 运算符来保留我之前获取的实体集合并与新的列表发射相连接。
我使用shareReplay(1) 确保在我的两个可观察对象之间每次切换后都能获得最新的发出列表(我不想再次获取已经获取的数据)。
我的问题 在内部 observable 之间切换后,如果我滚动以获取更多数据,控制台会显示“ALIENS”和“PONEYS”,同时它应该显示当前订阅的 observable 的日志。 看来以前的订阅永远不会被switchMap取消订阅。
我是不是误会了什么?
Ty 提前!
【问题讨论】:
标签: angular ionic-framework rxjs