【问题标题】:angular 4 observable returns [object Object]angular 4 observable 返回 [object Object]
【发布时间】:2018-05-09 18:51:21
【问题描述】:

我使用 Angular 4 作为前端,使用 Laravel 5.5 作为我的宁静 API。后端似乎没有问题,我可以发送 curl 请求并完全按照我的预期返回,一个带有 2 个键值对的 JSON:

[{"id":1,"name":"Mr. Nice"}]

当我尝试使用 angular 执行此操作时,我得到以下信息:

HERO: [object Object] 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>

班级:

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

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

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

谢谢。

【问题讨论】:

  • 您可以使用 ng-repeat 循环遍历结果,或者让 getHero 返回单个对象。 ng-if 也可能总是为真,因此可能会检查数组的长度。
  • 您应该订阅ngOnInit 或使用 |模板中的异步管道。
  • 那么您的getHero 实际返回的是什么(JSON)是您在问题中发布的内容吗?
  • 我的 json 返回 [{"id":1,"name":"Mr. Nice"}] 但由于某种原因在 observable 中使用 Hero 而不是 Hero[],angular 不会将其转换为类 Hero。我不明白为什么,在 Angular 的教程中,它适用于长度为 1 的数组...

标签: javascript json angular observable subscription


【解决方案1】:

您收到的是数组中的一个对象,这会在您的视图中导致[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}`))
    );
}

【讨论】:

  • 做到了,另一个解决方案是更改我从后端发送的内容,单个项目与包含 1 个项目的数组。谢谢
  • 不客气!既然它解决了您的问题,请考虑通过单击此答案投票下的灰色勾号来接受答案,这将问题标记为已解决:)
猜你喜欢
  • 2016-12-18
  • 2018-09-30
  • 2019-03-30
  • 1970-01-01
  • 2018-01-31
  • 2019-09-10
  • 1970-01-01
  • 2016-11-19
  • 2013-09-13
相关资源
最近更新 更多