#html #json #angular #ionic4 #ngfor
#HTML #json #угловой #ionic4 #ngfor
Вопрос:
Я использую ionic 4 и пытаюсь получить массив JSON с помощью TransportAPI через http.get, однако они используют целочисленные строки в качестве ключа для объектов, которые я пытаюсь получить, а затем для каждого объекта есть несколько массивов, например, так:
{
"departures": {
"25": [
{
"mode": "bus",
"line": "25",
"departure_time": "12:40"
},
{
"mode": "bus",
"line": "25",
"departure_time": "13:00",
}
],
"50": [
{
"mode": "bus",
"line": "50",
"departure_time": "12:46",
},
{
"mode": "bus",
"line": "50",
"departure_time": null,
},
{
"mode": "bus",
"line": "50",
"departure_time": "14:46",
}
]
}
}
Этот массив JSON хранится в «testArray: any;» и нет никаких проблем с его фактическим получением, поскольку я могу нормально распечатать его в журнале консоли. Через несколько часов я только что узнал, что вам нужно поместить цифровые клавиши в скобки, например, [«25»], чтобы получить к ним доступ, однако я не уверен, как это сделать при использовании *ngFor, или даже если бы вы это сделали. Это грубый код, который я пытаюсь вывести:
<div *ngFor="let bus of testArray.departures"> //this is where I'm not too sure
<ion-item-divider>
<ion-label> bus line: {{ bus.line }}</ion-label>
</ion-item-divider>
<ion-item *ngFor="let time of bus"> //no idea what I'm doing here either
{{ time.departure_time }}
</ion-item>
</div>
Любая помощь будет с благодарностью!
Редактировать: это код, который я использую для получения файла JSON (отсутствует импорт и компонент и т. Д. Для экономии места:
export class BusesPage implements OnInit {
testArray: any;
constructor(private http: HttpClient) {}
fillTestArray(){
this.http.get('assets/test.JSON').subscribe(data => {
this.testArray = data;
console.log(this.testArray);
});
}
ngOnInit() {
this.fillTestArray();
}
}
Ответ №1:
Если это данные, которые вы хотите перебрать, вам нужно использовать канал keyvalue, поскольку это объект. *ngFor без предназначен для перебора массивов. Это позволит вам выполнять итерации по объекту.
Затем вы можете выполнить итерацию по массиву, вложенному внутри объекта, без канала keyvalue . который должен отображать нужные вам данные.
<div *ngIf="testArray"> // checks testArray exists
<div *ngFor="let bus of testArray.departures | keyvalue">
<div *ngFor="let data of bus.value">
<ion-item-divider>
<ion-label> bus line: {{ data.mode }}</ion-label>
<ion-label> bus line: {{ data.line }}</ion-label>
<ion-label> bus line: {{ data.departure_time }}</ion-label>
</ion-item-divider>
</div>
</div>
</div>
Комментарии:
1. Я чувствую, что у меня что-то получается, но я продолжаю получать «Не удается прочитать свойство «отклонения» неопределенного», я подумал, что попробую сделать его безопасным для типов, добавив «testArray? .отклонения» но это только что дало мне «Не удается найти другой вспомогательный объект «[object Object]» типа «object». ngFor поддерживает привязку только к итерациям, таким как массивы. »
2. Я внес правку выше, я предполагаю, что данные поступают из api и т. Д., При загрузке происходит небольшое ожидание, Поэтому оберните его в *ngIf, проверяя, существуют ли данные, прежде чем он попытается нарисовать *ngFor. Если это не поможет, пожалуйста, покажите, как вы получаете данные 🙂
3. Я только что попытался добавить *ngIf, но я все еще получаю «Не удается прочитать свойство «отклонения» неопределенного», я больше не вызываю его напрямую из API, потому что у меня заканчиваются хиты (максимум 1000 в день в бесплатной версии, что более чем справедливо), поэтому я скопировал его вФайл JSON, код, который я использую для доступа к нему: [добавлен как редактирование выше, чтобы его можно было правильно просмотреть]
4. упс, проверьте редактирование еще раз. Я думаю, просто нужно быть testArray. Работает ли консоль. журнал показывает вам правильные данные? testArray.departures приведет к ошибке, потому что он пытается получить доступ к отправлениям в undefined, мой плохой. Просто *ngIf=»testArray»
5. Черт, да консоль. журнал показывает все правильно, я изменил «testArray.departures» на «testArray», но все равно получаю «Не удается найти другой вспомогательный объект»[object Object]» типа «object». ngFor поддерживает привязку только к итерациям, таким как массивы. »