我有一个订阅了ngOnInit
生命周期中的行为主题的组件。此组件html使用ngIf
在呈现表之前查看数据是否存在。
当我离开页面时,我想确保下次回来时,表格不可见,直到再次获取该数据为止。到目前为止,我能够做到这一点的唯一方法是在主题上调用next并发送一个空字符串,这感觉不对。
组件:
mapMetaData: any;
ngOnInit() {
// Subscribe to our map data
this._mapsService.uiMapMetaData
.subscribe(
results => {
if (results) {
this.mapMetaData = results;
}
}
);
}
/**
* Implement onDestroy life cycle
*
* @memberof ViewMapComponent
*/
ngOnDestroy() {
this._mapsService.updateMapMetaData('');
}
HTML:
<span *ngIf="mapMetaData">
<div class="page-header">
<h3 class="text-primary">{{ mapMetaData.TargetName }} <small>{{ mapMetaData.TargetDesc }}</small>
<button type="button" class="btn btn-default btn-sm pull-right" role="button" (click)="backToMaps()">
<i class="fa fa-arrow-left"></i> Back to Maps
</button>
</h3>
</div>
<app-map-versions [targetID]="targetID"></app-map-versions>
<app-map-exceptions [targetID]="targetID"></app-map-exceptions>
<app-map-rules></app-map-rules>
</span>
问题是,如果没有将空next
发送到行为主题,mapMetaData
仍然包含从之前的next
来电中收到的内容,从而会在表格中显示我何时回来它包含旧数据,然后在收到新数据时非常快速地改变。
有没有更好的方法来处理这个问题,还是我正确地做到了?
答案 0 :(得分:7)
您可以使用asObservable()
从Observable
获取BehaviorSubject
并存储订阅对象,ngOnDestroy
可以unsubscribe
:
在mapServie类中:
private mapSubject = new BehaviorSubject<any>(mapdata()); /* you get the idea */
public mapObservable = this.mapSubject .asObservable();
然后您可以执行以下操作:
mapMetaData: any;
subscription: Subscription;
ngOnInit() {
this.subscription = this._mapsService.uiMapMetaData
.subscribe(
results => {
if (results) {
this.mapMetaData = results;
}
}
);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}