在调查了几天(!?!)以查看当前Angular2应用程序的大量内存泄漏之后,我想出了一个新的发现:
显然,在整个应用程序中大量使用的异步管道正在订阅一个可观察的,但是当组件和管道被清理时,它从未被释放(取消订阅) .
它为一个只有少量用户操作的观察者累积了大约11,000个观察者(最终导致应用程序崩溃) .
我需要取消订阅observable,为了做到这一点,我需要一个破坏钩子,类似于ngOnDestroy,但是对于管道 .
有没有这样的钩子,或者如果没有,你会如何建议取消订阅?
如果您查看async pipe代码,您可以看到它们正在使用 ngOnDestroy ,就像您在指令中执行它一样 .
ngOnDestroy
来自 AsyncPipe 代码的片段:
AsyncPipe
@Pipe({name: 'async', pure: false}) @Injectable() export class AsyncPipe implements OnDestroy { ... ngOnDestroy(): void { if (isPresent(this._subscription)) { this._dispose(); } } ... }
关键是使用: pure:false ,
pure:false
来自OnDestroy
要创建有状态管道,您应该实现此接口并在PipeMetadata中将pure参数设置为false . 在给定相同输入的情况下,有状态管道可以产生不同的输出 . 有状态的管道可能包含在绑定被销毁时应该清理的状态 . 例如,可能需要处理对数据流的订阅,或者可能需要清除间隔 .
1 回答
如果您查看async pipe代码,您可以看到它们正在使用
ngOnDestroy
,就像您在指令中执行它一样 .来自
AsyncPipe
代码的片段:关键是使用:
pure:false
,来自OnDestroy