当前位置:  开发笔记 > 编程语言 > 正文

防止Angular 2中的内存泄漏?

如何解决《防止Angular2中的内存泄漏?》经验,为你挑选了1个好方法。

在Angular 2中有关于内存管理的任何特定缺陷,我应该知道吗?

管理组件状态以避免可能的泄漏的最佳实践是什么?

具体来说,我已经看到一些人在方法中取消订阅HTTP observablesngOnDestroy.我应该一直这样做吗?

在Angular 1.XI中,知道当a $scope被破坏时,其上的所有听众也会被自动销毁.Angular 2组件中的可观察量如何?

@Component({
  selector: 'library',
  template: `
    
        {{ book.title.text }}
        {{ book.author.text }}
    
  `
})
export class Library {
    books: Observable;

    constructor(private backend: Backend) {
        this.books = this.backend.get('/texts'); // <-- does it get destroyed
                                                 //     with the component?
    }
};

Eric Martine.. 16

按照@katspaugh的要求

在您的特定情况下,无需手动取消订阅,因为这是Async管道的工作.

检查AsyncPipe 的源代码.为简洁起见,我发布了相关代码

class AsyncPipe implements PipeTransform, OnDestroy {
    // ...
    ngOnDestroy(): void {
        if (isPresent(this._subscription)) {
          this._dispose();
        }
    }

正如您所看到的,Async管道实现了OnDestroy,当它被销毁时,它会检查是否存在某些订阅并将其删除.

你会在这个特定的情况下重新发明轮子(抱歉重复自己).这并不意味着您不能/不应该在您引用的任何其他情况下取消订阅.在这种情况下,用户在组件之间传递Observable以进行通信,因此最好手动取消订阅.

我不知道框架是否可以检测到任何活动订阅并在组件被销毁时自动取消订阅它们,这当然需要更多调查.

我希望这能澄清一下Async管道.



1> Eric Martine..:

按照@katspaugh的要求

在您的特定情况下,无需手动取消订阅,因为这是Async管道的工作.

检查AsyncPipe 的源代码.为简洁起见,我发布了相关代码

class AsyncPipe implements PipeTransform, OnDestroy {
    // ...
    ngOnDestroy(): void {
        if (isPresent(this._subscription)) {
          this._dispose();
        }
    }

正如您所看到的,Async管道实现了OnDestroy,当它被销毁时,它会检查是否存在某些订阅并将其删除.

你会在这个特定的情况下重新发明轮子(抱歉重复自己).这并不意味着您不能/不应该在您引用的任何其他情况下取消订阅.在这种情况下,用户在组件之间传递Observable以进行通信,因此最好手动取消订阅.

我不知道框架是否可以检测到任何活动订阅并在组件被销毁时自动取消订阅它们,这当然需要更多调查.

我希望这能澄清一下Async管道.


谢谢,有意思!所以Rob基本上说你不需要取消订阅带有单个值的observable(HTTP请求就是那些例子).
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有