Невозможно передать значение из службы в компонент

Я учусь использовать Angular.
Я создал API для Spring-boot и создал несколько компонентов в Angular для их просмотра, но ничего не могу просмотреть.

Я создал в angular службу для выполнения всех вызовов API.
В сервисе я создал массив типа Any и оставил его пустым.

  luoghi : any[] = [];

затем я делаю запрос GET и в методе присваиваю значение ответа массиву:

getAllLuoghi(){
    this.http.get("http://localhost:9595/oota-reg/api/luoghi/all").subscribe({
      next : (response : any) =>{

        console.info(response);
        
        this.luoghi = response;
 
      },
      error : (error) => {
        console.info("Something went wrong..", error);
        
      }
    })
  }

Теперь я создал еще два компонента: один — «Домой», а другой — «Карточка», базовые вещи.

Домашний компонент отвечает за циклическое переключение всех элементов массива и для каждого элемента выводит на экран карту компонентов карты.

    <div class = "flex justify-center flex-wrap gap-5">
        @for (item of cards; track $index) {
            <app-card></app-card>
        }@empty {
            <p>none</p>
        }
    
    </div>

Но вот в чем проблема в файле home.comComponent.ts, я хотел создать массив с именем card,
внедрить Сервис и передать картам значение массива, присутствующего в Сервисе, после вызова GET.

 private serviceLuoghi : LuoghiServiceService = inject(LuoghiServiceService);

  public cards : any[] = [];

  ngOnInit(): void {

    this.serviceLuoghi.getAllLuoghi();

    this.cards= this.serviceLuoghi.luoghi

    console.info(this.cards);
        
  }

Но массив карт пуст.
Как я могу передать данные?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Код внутри подписки является асинхронным (ждет завершения API), внешний код синхронен (не ждет), поэтому я надеюсь, что вы видите проблему: мы получаем доступ к свойству до завершения API. Таким образом, решение этой проблемы состоит в том, чтобы переместить код назначения в подписку, чтобы он был назначен после завершения вызова API.

getAllLuoghi(){
  return this.http.get("http://localhost:9595/oota-reg/api/luoghi/all")
}

Теперь сервис возвращает наблюдаемое, на которое мы можем подписаться внутри компонента, лучше подписываться на наблюдаемые внутри компонента, а не на сервисы.

  ngOnInit(): void {
    this.serviceLuoghi.getAllLuoghi().subscribe({
      next : (response : any) =>{
        console.info(response);
        this.serviceLuoghi.luoghi = response; // can remove if not needed!
        this.cards= response;
        console.info(this.cards);
      },
      error : (error) => {
        console.info("Something went wrong..", error);
      }
    })
  }

Ооо, теперь я вижу, спасибо :)

Andrea Crinella 27.06.2024 13:35

Другие вопросы по теме

В Angular 17 попытка очистить ввод после того, как пользователь зашел на страницу с помощью кнопки «Назад», приводит к появлению некогерентных значений
TS2305: модуль @angular/core/testing не имеет экспортированного асинхронного члена
Angular 18 — фоновое изображение не отображается на мобильном устройстве, но работает в браузере и инструментах Chrome
Socketio-client вызывает «Внутреннюю ошибку сервера: страница / не отображается в течение 30 секунд» в Angular 18
Ag-grid — определение значений заголовков настраиваемых столбцов при экспорте в Excel/CSV
Автозаполнение Angular Material в версии 15.4.9 не работает
Ошибка типа: невозможно прочитать свойства неопределенного значения (чтение «ɵcmp») в Angular 18
Пользовательский интерфейс Angular Material – Как добавить проверку onBlur для флажков/переключателей?
Когда именно запускается APP_INITIALIZER?
Почему этот цикл *ngFor отображает данные дважды?