Это совершенно нормально. Пока у вас нет подписки, у вас нет утечек памяти. async
pipe знает, когда подписываться и когда отписываться, поэтому вам не нужно беспокоиться о забытых подписках, async
отменит подписку, когда подписка больше не нужна.
Лучший способ - написать полный код каналов без какой-либо подписки ИМХО.
Например, в вашем случае я бы создал одну наблюдаемую в app.component.ts, которая объединяет все данные вместе и имеет одну наблюдаемую.
ngOnInit(): void {
this.data$ = combineLatest(
this.peopleSelectorsService.loading,
this.peopleSelectorsService.all,
).map(([isLoading, records]) => ({isLoading, records}));
}
<ng-container *ngIf="data$ | async as data">
<main [attr.isLoading]="data.isLoading">
<ng-container></ng-container>
<app-loading-container *ngIf="data.isLoading; else isMainController"></app-loading-container>
<ng-template #isMainController>
<app-user-talk-controller-container></app-user-talk-controller-container>
<app-user-talk-container [records]="data.records"></app-user-talk-container>
</ng-template>
</main>
</ng-container>
Основное преимущество, которое я вижу, состоит в том, что у нас одна подписка, и нет проблемы пересечения подписки, потому что время от времени в шаблоне, когда у вас есть несколько вложенных async
, вы можете обнаружить, что они тоже могут зависеть друг от друга, и они не будет работать должным образом. с одной подпиской такой проблемы нет.
Также это то, что мы делаем в нашем текущем проекте. время от времени data$
довольно большой, но все же он чувствует себя лучше, чем несколько подписок в шаблоне или в классе.