You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular项目调用本地API后无法可视化数据,显示[object Object]求助

Angular从本地API获取数据显示[object Object]问题

问题描述

我正在为Web开发课程制作个人作品集,之前用.json文件获取数据一切正常,但调用本地localhost接口时,浏览器控制台能返回正确的数据表,但HTML中插入数据时显示[object Object],尝试获取模型的单个属性也无任何反应。

相关代码与接口响应

Model.ts

export class info {
  id?: String;
  name: String;
  about: String;

  constructor(name: String,about: String){
    this.name = name;
    this.about = about;
  }
}

HTML文件

<div class="card mb-1 card-body">
    <div class="card-titles">
      <h3>Acerca de</h3>
      <div class="btn-edit">
        <a href="#" class="btn-right"><i class="fa-solid fa-pen-to-square"></i></a>
      </div>
    </div>
    <p class="card-text">{{info}}</p>
  </div>

Component.ts

import { InfoService } from './../../services/info.service';
import { Component, OnInit } from '@angular/core';
import { info } from 'src/app/model/info.model';

@Component({
  selector: 'app-about-me',
  templateUrl: './about-me.component.html',
  styleUrls: ['./about-me.component.css']
})
export class AboutMeComponent implements OnInit {
  info: info = new info("","");

  constructor(public infoService: InfoService) { }

  ngOnInit(): void {
    this.infoService.getInfo().subscribe(data => {this.info = data})
  }
}

InfoService.ts

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

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

  constructor(private http : HttpClient) { }

  public getInfo(): Observable<info>{
    return this.http.get<info>('http://localhost:8080/api/info/get');
  }
}

本地API响应

XHRGEThttp://localhost:8080/api/info/get
[HTTP/1.1 200  243ms]

[{"id":2,"name":"Eric Diaz","position":"Full Stack Web Developer Jr.","ubication":"Viedma, Rio Negro (Argentina)","banner":"https://i.imgur.com/zKNwxBl.jpg","profilePic":"https://imgur.com/rC52iuo.jpg","about":"Desarrollador Web autodidacta, encantado por aprender nuevas tecnologías, lenguajes de programación. Gran entusiasta en base de datos."}]

解决方案

核心问题是API返回的是包含单个对象的数组,但你的代码将其当作单个info对象处理,导致赋值和渲染出错,按以下步骤修改:

1. 调整服务的返回类型

服务中getInfo()的返回值应为数组类型的Observable,匹配API响应格式:

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

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

  constructor(private http : HttpClient) { }

  // 修改返回类型为数组的Observable
  public getInfo(): Observable<info[]>{
    return this.http.get<info[]>('http://localhost:8080/api/info/get');
  }
}

2. 调整组件的变量定义与数据处理

将组件中的变量改为数组类型,或直接取数组第一个元素(根据需求选择):

import { InfoService } from './../../services/info.service';
import { Component, OnInit } from '@angular/core';
import { info } from 'src/app/model/info.model';

@Component({
  selector: 'app-about-me',
  templateUrl: './about-me.component.html',
  styleUrls: ['./about-me.component.css']
})
export class AboutMeComponent implements OnInit {
  // 方案一:用数组存储所有返回数据
  infoList: info[] = [];
  // 方案二:只存储单个对象(确定只有一条数据时)
  // info: info = new info("", "");

  constructor(public infoService: InfoService) { }

  ngOnInit(): void {
    this.infoService.getInfo().subscribe(data => {
      // 方案一赋值数组
      this.infoList = data;
      // 方案二取数组第一个元素
      // this.info = data[0];
    })
  }
}

3. 调整HTML渲染逻辑

根据组件的变量类型,选择对应的渲染方式:

方案一:遍历数组(适合未来可能有多条数据的场景)

<div class="card mb-1 card-body">
    <div class="card-titles">
      <h3>Acerca de</h3>
      <div class="btn-edit">
        <a href="#" class="btn-right"><i class="fa-solid fa-pen-to-square"></i></a>
      </div>
    </div>
    <div *ngFor="let item of infoList" class="card-text">
      <p>{{item.name}}</p>
      <p>{{item.about}}</p>
    </div>
  </div>

方案二:直接渲染单个对象(确定只有一条数据时)

<div class="card mb-1 card-body">
    <div class="card-titles">
      <h3>Acerca de</h3>
      <div class="btn-edit">
        <a href="#" class="btn-right"><i class="fa-solid fa-pen-to-square"></i></a>
      </div>
    </div>
    <!-- 使用?安全导航操作符避免数据未加载时的空值报错 -->
    <p class="card-text">{{info?.name}}</p>
    <p class="card-text">{{info?.about}}</p>
  </div>

注意:之前直接写{{info}}会将对象转为字符串,因此显示[object Object],必须明确访问对象的具体属性(如info.name)才能正常显示内容。

内容的提问来源于stack exchange,提问作者Eric Diaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:35:44