javascript - Angular 4可观察返回[对象对象]

标签 javascript json angular observable subscription

我使用 Angular 4 作为我的前端,使用 Laravel 5.5 作为我的 Restful API。后端似乎很好地解决了这个问题,我可以发送curl请求并准确地返回我所期望的,一个带有2个键值对的JSON:

[{"id":1,"name":"尼斯先生"}]

当我尝试使用 Angular 执行此操作时,我得到以下结果:

HERO:[对象对象] HERO.ID:HERO.NAME

我的服务(我包含了一个工作获取请求仅供引用):

getHeroes(): Observable<Hero[]> {
    return this.http.get<Hero[]>(this.heroesUrl).pipe(
        tap(heroes => this.log(`fetched heroes, ${this.heroesUrl}`)),
        catchError(this.handleError('getHeroes', []))
    );
}

/** ISSUE HERE */
getHero(id: number): Observable<Hero> {
    const url = `${this.heroesUrl}/${id}`;
    return this.http.get<Hero>(url).pipe(
        tap(_ => this.log(`fetched hero id=${id}, ${url}`)),
        catchError(this.handleError<Hero>(`getHero id=${id}`))
    );
}

组件:

import { Component, OnInit, Input } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Location } from '@angular/common';
import { HeroService }  from '../hero.service';
import { Hero } from '../hero';

@Component({
    selector: 'app-hero-detail',
    templateUrl: './hero-detail.component.html',
    styleUrls: ['./hero-detail.component.css']
})
export class HeroDetailComponent implements OnInit {

    @Input() hero: Hero;

    constructor(
        private route: ActivatedRoute,
        private heroService: HeroService,
        private location: Location
    ) {}

    ngOnInit(): void {
        this.getHero();
    }

    getHero(): void {
        const id = +this.route.snapshot.paramMap.get('id');
        this.heroService.getHero(id)
            .subscribe(hero => this.hero = hero);
    }

    goBack(): void {
        this.location.back();
    }
}

模板:

<div *ngIf="hero">
        <div>HERO: {{ hero }} HERO.ID: {{ hero.id }} HERO.NAME {{ hero.name }}</div>
        <h2>{{hero.name | uppercase}} Details</h2>
        <div><span>id: </span>{{hero.id}}</div>
        <div>
                <label>name:
                        <input [(ngModel)]="hero.name" placeholder="name">
                </label>
        </div>
</div>

<button (click)="goBack()">go back</button>

类(class):

export class Hero {
    id: number;
    name: string;
}

据我所知,出于某种原因,Angular 无法将 json 识别为 Hero 类的单个实例,模板中的 *ngIf= 确实会被触发。服务中的 getHeroes 函数有效,它返回多个条目,我在模板中循环遍历它们,是否有一些相当明显的东西我丢失了?

我对 Angular 还很陌生,因此我们将不胜感激。

谢谢。

最佳答案

您收到的是数组中的一个对象,这会导致您的 View 中出现[object Object]。您想要的是从您的响应中提取单个英雄:

getHero(id: number): Observable<Hero> {
    const url = `${this.heroesUrl}/${id}`;
    return this.http.get<Hero[]>(url).pipe(
        map(heroes => heroes[0]) // here!
        tap(_ => this.log(`fetched hero id=${id}, ${url}`)),
        catchError(this.handleError<Hero>(`getHero id=${id}`))
    );
}

关于javascript - Angular 4可观察返回[对象对象],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47495583/

相关文章:

javascript - 将环境变量与常量进行比较时,字符串比较在 Javascript 中不起作用

javascript - 如何将 .nextElementSibling 应用于下拉菜单的下一项

javascript - 如何在 Angular 中创建 MouseEvent,包括位置属性

html - 刷新(提交)进程 Angular2 和 Firebase 上的页面

javascript - Angular 2 中的 Fetch.js 提示 CORS 请求

javascript - 如何将属性定义为变量?

javascript - 如何将json日期格式转换为普通日期格式。例如 :'/Date(1388412591038)/' 到 '12-30-2013' ?

php - Json 解码根属性

App Engine 上的 Python 2.7,simplejson 与原生 json,谁更快?

javascript - 如何使用 javascript 获取嵌套 Json 对象的名称