首页 文章

在angular2中是否有管道的破坏钩(与组件相同)?

提问于
浏览
4

在调查了几天(!?!)以查看当前Angular2应用程序的大量内存泄漏之后,我想出了一个新的发现:

显然,在整个应用程序中大量使用的异步管道正在订阅一个可观察的,但是当组件和管道被清理时,它从未被释放(取消订阅) .

它为一个只有少量用户操作的观察者累积了大约11,000个观察者(最终导致应用程序崩溃) .

我需要取消订阅observable,为了做到这一点,我需要一个破坏钩子,类似于ngOnDestroy,但是对于管道 .

有没有这样的钩子,或者如果没有,你会如何建议取消订阅?

1 回答

  • 6

    如果您查看async pipe代码,您可以看到它们正在使用 ngOnDestroy ,就像您在指令中执行它一样 .

    来自 AsyncPipe 代码的片段:

    @Pipe({name: 'async', pure: false})
    @Injectable()
    export class AsyncPipe implements OnDestroy {
      ...
    
      ngOnDestroy(): void {
        if (isPresent(this._subscription)) {
          this._dispose();
        }
      }
      ...
    }
    

    关键是使用: pure:false

    来自OnDestroy

    要创建有状态管道,您应该实现此接口并在PipeMetadata中将pure参数设置为false . 在给定相同输入的情况下,有状态管道可以产生不同的输出 . 有状态的管道可能包含在绑定被销毁时应该清理的状态 . 例如,可能需要处理对数据流的订阅,或者可能需要清除间隔 .

相关问题