Контекст
В приложении Angular у меня есть три <select> ящики, которые загружаются из базы данных с относительно небольшим набором данных. Эти коробки являются частью фильтра Component который отображается рядом с таблицей данных на стороне сервера. Компонент выводит фильтр асинхронно родительскому компоненту, который затем направляет его в таблицу, вызывает сервер, отфильтровывает SQL и т. Д.
Ориентируясь на область видимости, когда элемент управления загружен, я хочу вызвать сервер с тремя GET призывы. Пока они не завершатся, я хочу отобразить счетчик.
Поскольку я использую библиотеку элементов управления, часть кода уже готова. Я хочу спросить здесь, занимаюсь ли я Observables правильно с угловой точки зрения
Код, который я написал до сих пор
Код работает
export class MyComponent implements OnInit, OnDestroy {
public filterLoading$: BehaviorSubject<boolean>;
public select1: Observable<string[]>;
public select2: Observable<string[]>;
public select3: Observable<string[]>;
private filterLoadingSub$?: Subscription;
constructor(private remoteService: RemoteService) {
this.select1 = remoteService.getFirst();
this.select2 = remoteService.getSecond();
this.select3 = remoteService.getThird();
this.filterLoading$ = new BehaviorSubject<boolean>(true);
}
ngOnInit(): void {
this.filterLoadingSub$ = forkJoin([this.select1, this.select2, this.select3])
.subscribe(() => this.filterLoading$.next(false))
;
}
ngOnDestroy(): void {
if (!!this.filterLoadingSub$) {
this.filterLoadingSub$.unsubscribe();
}
}
}
Объяснение:
selectXпривязаны к переднему концу с<option *ngFor="let x of (selectX | async)" ...>- Предмет
filterLoading$используется для отображения счетчика. На самом деле мой аккордеон делает это за меня.<acme-filter-panel isLoaded="!(filterLoading$ | async)> - Затем я использовал
forkJoinоператору дождаться завершения всех трех вызовов. Меня не волнует последнее возвращенное значение, а только то, что три завершены. Но это приводит кSubscription - Под философией выбрасывать собственный мусор, каждый раз, когда я ударяю
SubscriptionЯ всегда пишу код для отказа от подписки. Однако это просто HTTP-вызовы, которые при вызове возвращаются только один раз.
Я действительно понимаю, что не обрабатываю логику ошибок, но на самом деле это выходит за рамки вопроса
Вопросов
У меня вопрос о двух аспектах.
Помимо перемещения кода из конструктора в ngOnInitпо причинам симметрии я пишу слишком много кода или есть какое-то упрощение, которое я могу использовать, чтобы сказать Angular, чтобы разблокировать прядильщик, когда произошли все три вызова?
Всегда ли нужно отказываться от подписки? Или бывают случаи, когда болтающийся подписка никому не вредит? Я узнал, что подписки используют память, поэтому считаю необходимым по возможности очищать ресурсы, даже если на современных машинах есть гигабайты оперативной памяти.
В общем, можно ли написать эту статью более лаконично? Для трех наборов данных мне пришлось создать четвертый элемент, который на самом деле необходим для отслеживания счетчика, и пятый элемент, используемый только при уничтожении для очистки. Я часто работаю с Observables & co.
