Мои два цента на этом:
Мне нравится метод takeUntil, упомянутый в ссылке от Wilt (хотя он случайно упомянул takeWhile). Если вы довольны использованием наследования, у меня есть класс, который предназначен только для решения этой проблемы, а затем любой компонент, которому может потребоваться автоматическая отмена подписки на вещи, наследуется от него. Это будет выглядеть примерно так:
export class Unsubscriber implements OnDestroy {
unsubscribe$: Subject<void> = new Subject()
constructor() {}
ngOnDestroy() {
this.unsubscribe$.next();
this.unsubscribe$.complete();
}
}
Затем в вашем компоненте вы расширяете этот класс, обязательно добавляя следующее каждый раз, когда подписываетесь на что-то:
.pipe(takeUntil(this.unsubscribe$))
Итак, случай вашего класса:
export class MyClass extends Unsubscriber implements OnInit, OnDestroy {
//...
ngOnInit() {
this.data.currentMessage.pipe(takeUntil(this.unsubscribe$)).subscribe(message => this.message = message);
}
}
Мне нравится это, потому что он будет работать независимо от того, сколько подписок у вашего компонента в настоящее время. Единственное раздражение - это то, что вы постоянно добавляете эту трубу, хотя это не страшное бремя, и даже в существующем проекте это не слишком сложно исправить.