【问题标题】:Angular 5 - Error in getting object [duplicate]Angular 5 - 获取对象时出错[重复]
【发布时间】:2018-12-03 11:16:02
【问题描述】:

我是 Angular 5 的新手,试图从外部 API 显示对象。它显示数据但由于对象类型而引发错误

来自 fixer.io 的 json 数据

{
"success":true,
"timestamp":1529865488,
"base":"EUR",
"date":"2018-06-24",
"rates":{
  "USD":1.165473,
  "AUD":1.565348,
  "CAD":1.546355,
  "PLN":4.319264,
  "MXN":23.309846
}
}

货币.服务

import { Injectable } from '@angular/core';
import { HttpClient} from '@angular/common/http';
import { CurrencyListMain } from './currencyList1';
import { Observable} from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class CurrencyService {

private _url:string = "http://data.fixer.io/api/latest";
constructor(private http: HttpClient) { }

getEmployee(): Observable<CurrencyListMain>{
return this.http.get<CurrencyListMain>(this._url);
}
}

currencycomponent.ts:

import { Component, OnInit } from '@angular/core';
import { CurrencyService } from '../currency.service';

@Component({
selector: 'app-currency',
template: `<h2>Employee List</h2>
          <ul >
            <li>success: {{employees.success}}</li>
            <li>timestamp: {{employees.timestamp}}</li>
            <li>base: {{employees.base}}</li>
            <li>rates: </li>
            <li>USD: {{employees.rates.USD}}</li>
            <li>AUD: {{employees.rates.AUD}}</li>
            <li>CAD: {{employees.rates.CAD}}</li>
            <li>PLN: {{employees.rates.PLN}}</li>
            <li>MXN: {{employees.rates.MXN}}</li>
          </ul>`,
 styleUrls: ['./currency.component.css']
})
export class CurrencyComponent implements OnInit {

public rates = {}
public employees = {};

constructor(private _currencyService: CurrencyService) { }

ngOnInit() {
this._currencyService.getEmployee()
.subscribe(data => this.employees = data);
}
}

currencylist1.ts - 接口:

import {UserRatesList} from './userRates' ;
export interface CurrencyListMain{
success:string,
timestamp:string,
base:string,
date:string,
rates: UserRatesList
}

userRates.ts 接口:

export interface UserRatesList{
USD:number,
AUD:number,
CAD:number,
PLN:number,
MXN:number
}

收到以下错误:

 CurrencyComponent.html:5 ERROR TypeError: Cannot read property 'USD' of 
undefined
at Object.eval [as updateRenderer] (CurrencyComponent.html:7)
at Object.debugUpdateRenderer [as updateRenderer] (core.js:10776)
at checkAndUpdateView (core.js:10152)
at callViewAction (core.js:10388)
at execComponentViewsAction (core.js:10330)
at checkAndUpdateView (core.js:10153)
at callViewAction (core.js:10388)
at execComponentViewsAction (core.js:10330)
at checkAndUpdateView (core.js:10153)
at callWithDebugContext (core.js:11040)

如何正确获取observable中的对象类型

【问题讨论】:

  • serviceMethod返回的data的签名是什么?您还需要为员工添加类型,例如employee: { [key:string] : UserRatesList}

标签: json angular object observable


【解决方案1】:

使用安全导航运算符 ? :

        <li>success: {{employees?.success}}</li>
        <li>timestamp: {{employees?.timestamp}}</li>
        <li>base: {{employees?.base}}</li>
        <li>rates: </li>
        <li>USD: {{employees?.rates.USD}}</li>
        <li>AUD: {{employees?.rates.AUD}}</li>
        <li>CAD: {{employees?.rates.CAD}}</li>
        <li>PLN: {{employees?.rates.PLN}}</li>
        <li>MXN: {{employees?.rates.MXN}}</li>

【讨论】:

  • 是否有另一种方法可以使用一个接口而不是2个。我使用了2个接口文件来描述对象。
  • 澄清一下,抱怨的不是编译器,因为编译器不知道它是否为空。这是运行时错误,不是编译时错误
  • @user184994,谢谢。
【解决方案2】:

尝试在您的 html 中使用“employees?.rates”。

问题是您的 html 在您的数据返回之前呈现,并且由于费率未定义,您无法访问 usd。

?.运算符将检查 null 或 undefined 并成功返回。

另外,您确定员工不是数组吗?你需要做一个 ngRepeat 吗?

【讨论】:

  • 是吗?操作员解决了我的问题,谢谢。我从 fixer.io 获取 json 以显示货币转换。它的对象,而不是数组。
  • 如果有其他方法可以获取对象而不是接口,请告诉我。或任何其他方式让 api 显示。我已经看到了一些显示数组但不显示对象类型的示例。
  • 你根本不需要这个接口。这就是打字稿可以给出编译器错误,所以你可以使用智能感知。但是您可以使用类而不是接口。不知道你为什么想要,但你可以。
  • 生病试试课,谢谢。我刚刚浏览了一些示例并尝试了自己的示例,只有这种方法有效,但出现了上述错误。我是新学的。
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
相关资源
最近更新 更多