当一个组件被销毁时,会自动进行角度处理"处理/关闭/完成"组件使用的observable及其相关订阅?
或者我应该在组件的onDestroy中明确地处理它们吗?
根据this question的接受答复,至少要到2017年4月,才需要手动处理可观察物。
我想知道是否仍然如此
编辑1
在角度文档中,我发现this pipe似乎可以解决问题,但我不确定如何在我的组件中使用它。 开发人员应该将observable存储在属性中,而不是在subscribe.next中设置属性。 如果我使用异步管道并将属性设置为observable,那么下面的组件模板将如何变成?
<h1>{{property.title}}</h1>
<p>{{property.description</p>
答案 0 :(得分:1)
您无需取消订阅所有可观察资料。
您应该取消订阅:
您无需取消订阅:
额外资源:
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(...);
如果您没有注意到,您可以为您的订阅指定名称,并将它们放在一个装饰数组中,以不取消订阅组件销毁。