Angular асинхронный канал с @for

Я использую последнюю версию Angular 18.1.0 и хочу использовать асинхронный канал для массива стран, полученных из серверной части с помощью http-клиента. Но при использовании новой угловой функции @for выдается ошибка:

Тип «Страна» должен иметь метод «Symbol.iterator», который возвращает итератор.

Мой код выглядит следующим образом страна.компонент.html

<main>
    <select name = "countries" id = "countries-selection">
        @for (country of countries$ | async; track $index) {
        <option value = "{{country}}">{{ country }}</option>
        }
    </select>
</main>

страна.компонент.ts

import { HttpClient } from '@angular/common/http';
import { Component } from '@angular/core';
import { Country } from './country.model';
import { Observable, map } from 'rxjs';
import { CommonModule } from '@angular/common';


@Component({
  selector: 'app-country',
  standalone: true,
  imports: [CommonModule],
  templateUrl: './country.component.html',
  styleUrl: './country.component.css'
})
export class CountryComponent {

  countries$: Observable<Country>;

  constructor(private httpClient: HttpClient) {
      this.countries$ = this.httpClient.get('http://localhost:3000/countries').pipe(
      map((response: any) => <Country> response.json()));

  }

}

Обновлено: Я получаю следующий массив с сервера:

[
    {
      "id": "1",
      "name": "Australia",
      "isCurrent": true,
      "timezone": "Asia/Karachi"
    },
    {
      "id": "2",
      "name": "Canada",
      "isCurrent": true,
      "timezone": "Asia/Karachi"
    },
    {
      "id": "3",
      "name": "Finland",
      "isCurrent": false,
      "timezone": "Europe/Tallinn"
    }

]

Каким может быть возможное решение, если я хочу использовать rxjs, а не JS async/await для выбора стран?

пожалуйста, поделитесь ответом API

Naren Murali 16.07.2024 13:54

Рискну сказать, что response.json() делает не то, что вы думаете. Более того, response.json() уже давно не требуется в Angular. Попробуйте: this.countries$ = this.httpClient.get<Country[]>('http://localhost:3000/countr‌​ies'); без pipe(map())

Michael D 16.07.2024 13:56
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
2
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

@for перебирает массивы. В соответствии с вашими типами countries$ является Observable объекта Country, который Angular не допускает для перебора. Просто добавьте [], чтобы указать, что это список объектов Country:

export class CountryComponent {

  countries$: Observable<Country[]>;

  constructor(private httpClient: HttpClient) {
      this.countries$ = this.httpClient.get<Country[]>('http://localhost:3000/countries');
  }
}

Еще одно замечание: вызов response.json() не поддерживается HTTP-клиентом Angular. По умолчанию он будет анализировать JSON, поэтому, возможно, вы можете просто пропустить эту часть.

Я отредактировал свой вопрос с ответом сервера, который я получаю. На самом деле я получаю массив с сервера.

Fahad 16.07.2024 14:18

Но ваш тип по-прежнему Observable<Country>, когда он должен быть массивом, например. Observable<Country[]>

Jamie Rees 16.07.2024 14:23

@ Фахад, это то, что я подозревал, как я уже сказал в своем ответе, вам нужно настроить типы. В настоящее время они не отражают реальности.

JSON Derulo 16.07.2024 14:27

@Фахад ссылка на stackblitz

Naren Murali 16.07.2024 15:02

Большое спасибо @JSON Деруло, Нарену и другим. вы сэкономили мне часы. В моем коде было несколько глупых ошибок. Теперь все работает.

Fahad 16.07.2024 15:11

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