После одного целого дня, ломающего мою голову, пытаясь найти подходящее решение, я наконец-то пришел сюда за помощью.
ЧТО МНЕ НУЖНО
В сервисе я должен предоставить функцию, возвращающую массив объектов; В первый раз эти объекты извлекаются из веб-службы с помощью HttpClient, но затем я хотел бы сохранить их в локальной переменной, чтобы избежать затрат времени и трафика при каждом вызове этой сервисной функции.
Наконец, я должен показать эти объекты в теге <select *ngFor
и установить значение по умолчанию после установки значений.
ПЕРВАЯ ПОПЫТКА
service.ts
stati = null;
getStati() {
if (this.stati) return this.stati;
return this.http.get<ApiResponse>(this.apiUrl + 'lists/stati')
.pipe(
retry(3),
map(data => {
if (data.status === 0)
this.stati = data.response; // <-- this is an array
return this.stati;
}
));
}
request.component.ts
this.svcApi.getStati()
.subscribe((stati) => {
this.stati = stati;
this.request.nascita.stato = 'IT';
this.request.residenza.stato = 'IT';
});
request.component.html
<select class="form-control"
[(ngModel)]="request.nascita.stato" name="stato">
<option *ngFor="let stato of stati"
[value]="stato.codice">{{stato.nome | uppercase}}</option>
</select>
Это работает ТОЛЬКО в первый раз, но когда мой маршрутизатор (пере) активирует маршрут, я получаю ошибку в компоненте, утверждающую, что svcApi.getStati().subscribe
не является функцией; естественно, я понимаю это, потому что на этот раз я не возвращаю Observable, а вместо этого массив!
ВТОРАЯ ПОПЫТКА
Поэтому я попытался изменить сервисную функцию:
if (this.stati) return Observable.from(this.stati);
Но когда я возвращаюсь к маршруту, я получаю эту ошибку в консоли:
Ошибка: не удается найти другой поддерживающий объект '[объект объекта]'
типа «объект». NgFor поддерживает только привязку к Iterables, таким как
Массивы.
ТРЕТЬЯ ПОПЫТКА
Моя последняя попытка была также изменить
<option *ngFor="let stato of stati | async"
но я получаю эту ошибку
ОШИБКА TypeError: Невозможно прочитать свойство 'dispose' из null в
AsyncPipe.push
Я почти уверен, что простое решение должно существовать, но, будучи новичком, я не могу думать об этом.