Как отобразить массив JSON в таблице html с помощью *ngFor?

#arrays #angular #typescript #angular7 #ngfor

#массивы #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, но все равно не могу отобразить данные.

Ответ №1:

Проблема в том, что тип переменной параметра — string вместо array:

 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. Каков тип поступающего объекта данных?

Ответ №2:

в моем проекте используются данные файла 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
  }
]
 

Путь должен быть таким

 ProjectNamesrcapppagesmodule_configurationparameter.json
 

Импортировать параметр.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>
 

Насколько я понимаю, я дал решение, надеюсь, оно будет вам полезно.

Комментарии:

1. мой импорт, похоже, не определен, когда я пытаюсь получить доступ к свойству, как вы сделали для parameter.json. Я получил сообщение об ошибке msg =>»ОШИБКА в src/app/app.component.ts(5,32): ошибка TS2732: не удается найти модуль ‘./assets/fyp2019-ff11e-export.json’. Рассмотрите возможность использования ‘—resolveJsonModule’ для импорта модуля с расширением ‘.json'»

2. Привет, что нам очень просто Перейти в папку src в разделе «Создать файл как «typings.d.ts», вставьте этот код объявить var module: NodeModule; интерфейс NodeModule { id: string; } объявить модуль «*.json» { const value: any; экспортировать значение по умолчанию; }