照顾组件的可观察性和订阅量。的onDestroy

时间:2018-02-13 09:12:41

标签: angular observable angular5 angular-component-life-cycle

当一个组件被销毁时,会自动进行角度处理"处理/关闭/完成"组件使用的observable及其相关订阅?

或者我应该在组件的onDestroy中明确地处理它们吗?

根据this question的接受答复,至少要到2017年4月,才需要手动处理可观察物。

我想知道是否仍然如此

编辑1

在角度文档中,我发现this pipe似乎可以解决问题,但我不确定如何在我的组件中使用它。 开发人员应该将observable存储在属性中,而不是在subscribe.next中设置属性。 如果我使用异步管道并将属性设置为observable,那么下面的组件模板将如何变成?

<h1>{{property.title}}</h1>
<p>{{property.description</p>

2 个答案:

答案 0 :(得分:1)

您无需取消订阅所有可观察资料。

您应该取消订阅:

  • 表单控件
  • 自定义可观察量,基本上是您从主题等创建的。
  • 一般的第三方观察

您无需取消订阅:

  • HttpClient的
  • 路由器
  • 有些运营商喜欢
  • 使用异步管道

额外资源:

https://www.reddit.com/r/Angular2/comments/66v9yy/so_we_should_never_really_unsubscribe_from/

Angular/RxJs When should I unsubscribe from `Subscription`

https://medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87

答案 1 :(得分:-3)

您必须取消订阅订阅。 Angular不会为你处理。

您可以使用装饰器进行自动取消订阅:

export function AutoUnsubscribe(blacklist = []) {
  return function (constructor) {
    const original = constructor.prototype.ngOnDestroy;
    constructor.prototype.ngOnDestroy = function () {
      // tslint:disable-next-line:forin
      for (const prop in this) {
        const property = this[prop];
        if (!blacklist.includes(prop)) {
          if (property && (typeof property.unsubscribe === 'function')) {
            property.unsubscribe();
            // console.log(prop + ' unsubscribed');
          }
        }
      }
      if (original && typeof original === 'function') { original.apply(this, arguments); }
    };
  };
}

在您的组件中,您现在只需要执行此操作:

@AutoUnsubscribe()
export class MyComponent { ... }

请记住将订阅分配给变量,以便可以取消订阅。这样的事情(随机字符串生成):

this[Math.random().toString(36).slice(-5)] = this.myService.myFunc().subscribe(...);

如果您没有注意到,您可以为您的订阅指定名称,并将它们放在一个装饰数组中,以取消订阅组件销毁。