#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; экспортировать значение по умолчанию; }