【问题标题】:Can't print nested JSON data with Angular 6无法使用 Angular 6 打印嵌套的 JSON 数据
【发布时间】:2018-07-05 20:28:38
【问题描述】:

我正在学习编码,但在使用 Angular 6 时遇到了这个问题,我似乎无法解决。我之前能够获取 JSON 的数据,但现在它是嵌套的,我不知道如何获取它的数据。这就是我到目前为止所做的事情

服务

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs';

import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class TestService {
    url = "http://localhost:80/assets/data/test.json";
    constructor(private http:Http) { }

    getTestWithObservable(): Observable<any> {
        return this.http.get(this.url)
            .map(this.extractData)
            .catch(this.handleErrorObservable);
    }

    private extractData(res: Response) {
        let body = res.json();
        return body;
    }

    private handleErrorObservable (error: Response | any) {
        console.error(error.message || error);
        return Observable.throw(error.message || error);
    }
}

组件

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';

import { TestService } from './test.service';

@Component({
    selector: 'ngx-test',
    styleUrls: ['./test.component.scss'],
    templateUrl: './test.component.html',
})

export class TestComponent implements OnInit {
    observableTest: Observable<any>
    errorMessage: String;

    constructor(private testService: TestService) { }

    ngOnInit(): void {
        this.testService.getTestWithObservable().subscribe(
            res => {
                let user = res[0]["users"];
                let user_data = user["data"];
                console.log(user_data["name"]);
            }
        );
    }
}

JSON

[{
    "id": 1,
    "users": {
        "user_id": 14,
        "data": [{
            "name": "James",
            "age": 20
        },
        {
            "name": "Damien",
            "age": 25
        }]
    }
}]

HTML

<div *ngFor="let x of user_data; let i = index">
    {{x.name}}
</div>

如果有人能指出解决方案或我做错了什么,我将不胜感激。

【问题讨论】:

  • 你在console.log的时候获取数据吗?
  • user_data 是一个数组,所以你需要user_data[0]["name"](虽然没有理由为属性使用方括号语法,也可以使用user_data[0].name
  • this.user_data=res[0].users.data。说明: res 是一个数组, res[0] 是一个拥有 users 属性的对象。 users 属性有一个属性 data 是您要查找的数组

标签: json angular typescript nested ngfor


【解决方案1】:

您需要将数据保存在实例属性中才能访问它。 user_data 是你的函数本地的,你不能在模板中访问它,所以你应该使用这样的东西:

export class TestComponent implements OnInit {
    observableTest: Observable<any>
    errorMessage: String;
    user_data: any;

    constructor(private testService: TestService) { }

    ngOnInit(): void {
        this.testService.getTestWithObservable().subscribe(
            res => {
                let user = res[0]['users'];
                let user_data = user['data'];
                console.log(user_data['name']);
                this.user_data = user_data; // here
            }
        );
    }
}

【讨论】:

  • 每个双引号都应该换成单引号为 "users" -> 'users'
【解决方案2】:

您的代码存在一些问题:

export class TestComponent implements OnInit {
  observableTest: Observable<any>
  errorMessage: String;

  user_data: any;

  constructor(private testService: TestService) {
  }

  ngOnInit(): void {
    this.testService.getTestWithObservable().subscribe(
      res => {
        let user = res[0]["users"];
        this.user_data = user["data"];
        console.log(user_data["name"]);
      }
    );
  }
}

在 Angular >= 4 中,管道方法更好地处理 Observable

this.http.get(this.url)
  .pipe(
    filter(...),
    map(...)
  )

使用 HttpClient(不推荐使用 Http),.json() 为您完成。您不需要您的 extractData 函数。

  • 您必须初始化变量。并用“this”来指代它。

【讨论】:

  • OP 的代码没有使用HttpClient,所以需要extractData。也就是说,代码几乎肯定应该更新为使用HttpClient
  • 感谢您的提示,我已经选择了正确的答案,但是是的,这就是问题所在。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2019-07-21
  • 2017-06-24
相关资源
最近更新 更多