【问题标题】:Making an API GET request and displaying the information in HTML.发出 API GET 请求并以 HTML 格式显示信息。
【发布时间】:2019-05-09 09:23:57
【问题描述】:

我一直在尝试进行 API 调用,但没有成功。显示名称时收到此错误消息。非常抱歉,我已经粘贴了三个文件,但这是我在这里的第一个问题,我是新手。感谢您的帮助。

Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays.

这是我的beers.service.ts 文件

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class BeersService {
  private beerUrl = 'https://api.punkapi.com/v2/beers/';
  beers;

  constructor(private _httpClient: HttpClient) { }

  getListOfBeer() {
    return this._httpClient.get(this.beerUrl).subscribe(
      res => {
         this.beers = res;
    });
  }
}

这是我的app.component.ts 我感觉问题出在构造函数上,但我尝试的一切都没有成功。

import { Component } from '@angular/core';
import { BeersService } from './beers.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  beers;

  constructor(private _beerService: BeersService) {
    this.beers = _beerService.getListOfBeer()
  }
}

最后是我的app.component.html

<div class="container">
  <div *ngFor="let beer of beers">
    <p>{{ beer.name }}</p>
  </div>
</div>

【问题讨论】:

  • beers 可能是一个对象,如果您想在 HTML 中对其进行迭代,则需要将其设为 Array
  • 我理解这一点,并尝试将啤酒导出为beers = Beers[];beers = any;,甚至将get 请求作为可观察的但没有运气。 @xyz
  • 你能做一个啤酒的控制台日志并更新你在日志中看到的问题吗?

标签: angular typescript api constructor ngfor


【解决方案1】:

您应该阅读 RxJS,因为它在 Angular HTTP 客户端中使用。函数 getListOfBeers 返回一个订阅,而不是啤酒数组。

服务中

getListOfBeer() {
    return this._httpClient.get(this.beerUrl);
}

在组件中

constructor(private _beerService: BeersService) {
    _beerService.getListOfBeer().subscribe(res => this.beers = res)
}

并确保使用空数组实例化啤酒

beers = []

【讨论】:

  • 哦,是的!请不要在构造函数中这样做
  • 嘿伙计解决了我的问题!感谢您花时间回答。
【解决方案2】:

您有一个未初始化的变量。当你只是说beersbeers:any 时,它仍然是未定义的。这意味着,您的模板正在尝试循环一些未定义的内容(直到 API 请求返回,即在您获得该内容后的几毫秒)。

预初始化数组或有条件地显示它。

版本 1:

预初始化app.component.ts中的数组:

export class AppComponent {
  beers = [];
  ...

版本 2

在应用启动时,您的 component.beers 是未定义的,直到 API 返回。您不能循环未定义,因此在此之前隐藏列表。查看beers.component.html

<div class="container" *ngIf="beers">
    <div *ngFor="let beer of beers"><p>{{ beer.name }}</p>
</div>

【讨论】:

  • 我猜,如果它是未定义的,那么它不应该循环。
  • 但事实并非如此。这就是OP收到错误的原因。他要么从一开始就定义它,要么有条件地渲染它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多