如何使用* NgFor在html表中显示JSON数组?

时间:2019-04-13 07:58:41

标签: arrays angular typescript angular7 ngfor

我尝试显示从外部JSON文件到html表的数组数据。我设法在控制台日志中读取数据,但是无法显示数据。我对Angular 7还是很陌生,所以在编码过程中可能会错过一些重要的事情,对此我一无所知。

app.component.ts

import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/https';
import { HttpErrorResponse } from '@angular/common/https';
import { getRootView } from '@angular/core/src/render3/util';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  constructor (private httpService: HttpClient) { }
  parameter: string;

  ngOnInit () {
    this.httpService.get('./assets/fyp2019-ff11e-export.json').subscribe(
      data => {
        this.parameter = data as string;   // FILL THE ARRAY WITH DATA.
        console.log(this.parameter);    
      },
      (err: HttpErrorResponse) => {
        console.log (err.message);
      }
    );
  }


从json文件中采样数据:

{
  "GoogleSheet" : {
    "Data1" : {
      "LevelTankA" : 1.5,
      "LevelTankB" : 1,
      "MotorSpeed" : 15,
      "Time" : 1
    },
    "Data2" : {
      "LevelTankA" : 5,
      "LevelTankB" : 2.3,
      "MotorSpeed" : 15,
      "Time" : 2
    },
    "Data3" : {
      "LevelTankA" : 6,
      "LevelTankB" : 2.9,
      "MotorSpeed" : 20,
      "Time" : 3
    }
  }
}


component.html的一部分编码

  <table>
      <tr>
          <th>Tank A</th>
              <th>Tank B</th>
                  <th>Motor Speed</th>
                      <th>Time</th>        
      </tr>
      <!-- BIND ARRAY TO TABLE -->
      <tr *ngFor="let val of parameter; let i = index">   
    //prepare the key and grab the data key and values
    <td *ngFor="let obj of val">{{obj.LevelTankA | json}}</td>
    <td *ngFor="let obj of val">{{obj.LevelTankB | json}}</td>
    <td *ngFor="let obj of val">{{obj.MotorSpeed | json}}</td>
    <td *ngFor="let obj of val">{{obj.Time | json}}</td>           
      </tr>
  </table>

我不知道为什么不能将数组绑定到html表。我尝试使用* ngFor和* ngIf进行各种编码,但仍然无法显示数据。

2 个答案:

答案 0 :(得分:0)

问题在于参数变量的类型是字符串而不是数组:

parameter: string ->  parameter: any[];

而且从服务获取数据时,应将响应作为对象处理。

this.httpService.get('./assets/fyp2019-ff11e-export.json').subscribe(
      data => {
        this.parameter = data;   // FILL THE ARRAY WITH DATA.
        console.log(this.parameter);    
      },
      (err: HttpErrorResponse) => {
        console.log (err.message);
      }
    );

编辑: json文件也有问题,应该像这样:

{
  "GoogleSheet" : [
    "Data1" : {
      "LevelTankA" : 1.5,
      "LevelTankB" : 1,
      "MotorSpeed" : 15,
      "Time" : 1
    },
    "Data2" : {
      "LevelTankA" : 5,
      "LevelTankB" : 2.3,
      "MotorSpeed" : 15,
      "Time" : 2
    },
    "Data3" : {
      "LevelTankA" : 6,
      "LevelTankB" : 2.9,
      "MotorSpeed" : 20,
      "Time" : 3
    }
  ]
}

并且由于存在顶层对象,因此必须修改ngfor:

<tr *ngFor="let val of parameter.GoogleSheet; let i = index">   

答案 1 :(得分:0)

在我的项目中使用Json文件数据。

首先创建文件夹并创建文件parameter.json

我已经像下面一样修改了您的Json

[
  {
    "LevelTankA": 1.5,
    "LevelTankB": 1,
    "MotorSpeed": 15,
    "Time": 1
  },
  {
    "LevelTankA": 5,
    "LevelTankB": 2.3,
    "MotorSpeed": 15,
    "Time": 2
  },
  {
    "LevelTankA": 6,
    "LevelTankB": 2.9,
    "MotorSpeed": 20,
    "Time": 3
  }
]

路径应该像

ProjectName\src\app\pages\module\_configuration\parameter.json

在组件中导入parameter.json

import * as parameterData from './_configuration/parameter.json';

将参数声明为以下任何内容

parameter: any;

在ngOninit中初始化您将获得数据。

  ngOnInit() {
    this.parameter= <any>parameterData.default;
  }

我已经修改了您的HTML文件。

 <table>
      <tr>
          <th>Tank A</th>
              <th>Tank B</th>
                  <th>Motor Speed</th>
                      <th>Time</th>        
      </tr>
      <!-- BIND ARRAY TO TABLE -->
      <tr *ngFor="let val of parameter; let i = index">   
    //prepare the key and grab the data key and values
            <td>{{ val.LevelTankA}}</td>
            <td>{{ val.LevelTankB}}</td>
            <td>{{ val.MotorSpeed}}</td>
            <td>{{ val.Time}}</td>
      </tr>
  </table>

根据我的理解,我已经给出了解决方案,希望对您有用。