angular - 我是否需要完成一个仅用于组成另一个 Observable 的主题?
问题描述
嗨,我有以下组件:
export class PreviewReportComponent implements OnInit, OnChanges, OnDestroy {
@Input() params: PreviewParams;
reload$: Subject<void> = new Subject();
preview$: Observable<SafeHtml>;
constructor(private reportService: ReportService) {}
ngOnInit() {
this.preview$ = this.reload$.pipe(
debounceTime(200),
startWith([null]),
switchMap(() => this.reportService.getPreview(this.params)),
);
}
ngOnChanges() {
this.reload$.next();
}
ngOnDestroy(){
this.reload$.complete();
}
}
我是否需要实现 OnDestroy 并在 reload$ 主题上调用完成?
我已经在使用 AsyncPipe 订阅 preview$ Observable。
解决方案
我是否需要实现 OnDestroy 并在 reload$ 主题上调用完成?
如果您担心的是内存泄漏,那么不,没有必要实施OnDestroy
来完成您的主题,因为您没有订阅您的组件。当您的订阅在组件被销毁后保持打开状态时,就会发生内存泄漏。
由于您AsyncPipe
用于处理订阅,因此您无需担心。
实际上,您甚至不需要OnInit
:
export class PreviewReportComponent implements OnChanges {
@Input() params: PreviewParams;
private reload$ = new Subject<void>();
public preview$ = this.reload$.pipe(
startWith([null]),
debounceTime(200),
switchMap(() => this.reportService.getPreview(this.params)),
);
constructor(private reportService: ReportService) {}
ngOnChanges() {
this.reload$.next();
}
}
OnChanges
如果您将参数更改为设置器,您也可以摆脱它:
export class PreviewReportComponent {
private params$ = new Subject<PreviewParams>();
@Input() set params(params: PreviewParams) {
this.params$.next(params);
}
public preview$ = this.params$.pipe(
startWith([null]),
debounceTime(200),
switchMap(params => this.reportService.getPreview(params)),
);
constructor(private reportService: ReportService) {}
}
推荐阅读
- java - Eclipse sts IDE中有没有办法从文件中批量加载许多环境变量
- r - 当时间序列在行而不是列中时绘图 - 使用 R
- scala - Scala Logging: is LazyLogging blocking or non-blocking?
- java - Selenium driver.findElement 找到元素,sendKeys 工作,然后在移动到新字段时为空
- python - 用于清理数据集的 Pandas 布尔语句
- python - 如何压缩矩阵以避免内存错误?
- spring-boot - 带有 Spring Boot 的 CORS - 将 GET 请求限制到某些域
- java - 将 2 个 Java 变量简化为一个
- wordpress - 修改循环以排除属于某个类别且没有其他类别的帖子
- xpages - 如何计算重复控件中显示的行数