Angular4 Невозможно найти другой поддерживающий объект '[object Object]' типа 'object'. NgFor поддерживает привязку только к Iterables, таким как массивы

Застрял с ошибкой = Не удается найти другой поддерживающий объект «[объект объекта]» типа «объект». NgFor поддерживает привязку только к Iterables, таким как Arrays.

Сервисный код =

`export class PokemonServiceService {
    constructor(private http: HttpClient) { }

    get getCards(): Observable<ICards[]>{
    return this.http.get<ICards[]>('https://api.pokemontcg.io/v1/cards?')
        }
    }
 export interface Ability {
  name: string;
  text: string;
  type: string;
   }
export interface Attack {
  cost: string[];
  name: string;
  text: string;
  damage: string;
  convertedEnergyCost: number;
}
export interface Weakness {
  type: string;
  value: string;
}
export interface Resistance {
  type: string;
  value: string;
}
export interface Card {
  id: string;
  name: string;
  nationalPokedexNumber: number;
  imageUrl: string;
  imageUrlHiRes: string;
  types: string[];
  supertype: string;
   subtype: string;
   ability: Ability;
   hp: string;
   retreatCost: string[];
   convertedRetreatCost: number;
   number: string;
  artist: string;
  rarity: string;
  series: string;
  set: string;
  setCode: string;
  text: string[];
  attacks: Attack[];
  weaknesses: Weakness[];
  resistances: Resistance[];
  evolvesFrom: string;
 }
export interface ICards {
  cards: Card[];
}

Код компонента =

`export class MainActivityComponent implements OnInit {
 PokemonData: ICards[];
 constructor(private service: PokemonServiceService ){}
 ngOnInit(): void {
 this.service.getCards.subscribe(data => this.PokemonData = data);      
            }



}`

HTML-код =

`<div class = "card" *ngIf = "PokemonData">
<div class = "card-header">Pokemon</div>
<div class = "card-block">
  <table class = "table table-hover">
      <thead>
          <tr>
              <th>Naam</th>
              <th>id</th>
              <th>hp</th>
              <th>pokedexnumer</th>

          </tr>
      </thead>
      <tbody>
          <tr *ngFor = "let d of PokemonData">      <!-- | async -->
              <td>{{d.name}}</td>
              <td>{{d.id}}</td>
              <td>{{d.hp}}</td>
              <td>{{d.nationalPokedexNumber}}</td>
          </tr>
      </tbody>
  </table>

) `

и если я использую это в своем компоненте

ngOnInit(): void {
this.service.getCards()
            .subscribe(data => {
              console.info(data);
            })

затем я получаю данные из api (карт), но если я попытаюсь отсортировать их в списке, я получаю эту ошибку = Не могу найти другой поддерживающий объект «[объект объекта]» типа «объект». NgFor поддерживает привязку только к Iterables, таким как Arrays.

API фактически не возвращает массив. Он возвращает объект, который содержит свойство с именем cards, которое представляет собой массив

user184994 19.05.2018 19:31
Тестирование функциональных 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
1
1
2 686
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

API не возвращает массив, он возвращает объект со свойством cards.

Измените свой сервис, например:

get getCards(): Observable<ICards>{
    return this.http.get<ICards>('https://api.pokemontcg.io/v1/cards?')
}

Вы составляете так:

PokemonData: ICards;

А ваш шаблон такой:

<tr *ngFor = "let d of PokemonData.cards">

Спасибо за помощь !! !!! изменение <tr * ngFor = "let d of PokemonData.cards"> исправило это :)

Inias 19.05.2018 19:40

@Inias Рад помочь, пожалуйста, не стесняйтесь принять ответ, если это устранило вашу проблему :)

user184994 19.05.2018 19:41

Каков ваш результат регистрации данных? Может, он вот так завёрнут, попробуй сначала развернуть.

Ответ

[{someData},{someData}]

Развернуть

function readData < T > (xhrData: any) {

  try {


    var len = Object.keys(xhrData).length;

    var temp: Array < T > = [];

    for (var x = 0; x < len; x++) {
      //unwrap it and transfer it to an array -
      temp[temp.length] = xhrData[x]; //example only
    }
  } catch (e) {
    return [];
  }


  return temp;
}

Мне нравится оборачивать мой читатель блоком try catch, чтобы также улавливать сообщения об ошибках от сервера, если это не JSON.

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