Ich habe eine angular App erstellt, die Daten aus einer JSON-Datei abruft. Ich habe jedoch Probleme mit der Anzeige der Daten in HTML. Viele Variablen sind in Niederländisch, es tut mir leid das. Ich bin auch ein bisschen neu in all dem :)
Das ist mein Service:
import {Injectable} from '@angular/core';
import {Http, RequestOptions, Response, Headers} from '@angular/http';
import {Observable} from "rxjs";
import {Afdelingen} from "./models";
@Injectable()
export class AfdelingService {
private afdelingenUrl = '/assets/backend/afdelingen.json';
constructor(private http: Http) {
}
getAfdelingen(): Observable<Afdelingen[]> {
return this.http.get(this.afdelingenUrl)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = <Afdelingen[]>res.json();
return body || {};
}
private handleError(error: any): Promise<any> {
console.error('An error occurred', error);
return Promise.reject(error.message || error);
}
addAfdeling(afdelingsNaam: string, afdeling: any): Observable<Afdelingen> {
let body = JSON.stringify({"afdelingsNaam": afdelingsNaam, afdeling: afdeling});
let headers = new Headers({'Content-Type': 'application/json'});
let options = new RequestOptions({headers: headers});
return this.http.post(this.afdelingenUrl, body, options)
.map(res => <Afdelingen> res.json())
.catch(this.handleError)
}
}
Dies ist ein Teil meiner JSON-Datei:
{
"afdelingen": [
{
"afdelingsNaam": "pediatrie",
"kamernummer": 3.054,
"patientid": 10001,
"patientennaam": "Joske Vermeulen",
"reden": "Appendicitis",
"opname": "12/05/2017",
"ontslag": "28/06/2017",
"behandelingstype": "nazorg",
"behandelingsomschrijving": "wondverzorging",
"behandelingsdatum": "10/06/2017",
"behandelingstijd": "10:20",
"vegitarisch": false,
"Opmerkingen": "",
"sanitair": true,
"kinderverzorgingsruimte": false,
"salon": true,
"hulp": true,
"width": 5,
"height": 5
},
{
"afdelingsNaam": "pediatrie",
"kamernummer": 3.055,
"patientid": 10002,
"patientennaam": "Agnes Vermeiren",
"reden": "Beenbreuk",
"opname": "18/05/2017",
"ontslag": "30/06/2017",
"behandelingstype": "nazorg",
"behandelingsomschrijving": "wondverzorging",
"behandelingsdatum": "10/06/2017",
"behandelingstijd": "10:20",
"vegitarisch": true,
"Opmerkingen": "",
"sanitair": true,
"kinderverzorgingsruimte": false,
"salon": true,
"hulp": false,
"width": 5,
"height": 5
}]}
Die Komponente:
import {Component, OnInit, Input} from '@angular/core';
import {Afdelingen} from "../models";
import {AfdelingService} from "../afdeling.service";
import {PatientService} from "../patient.service";
@Component({
selector: 'app-afdeling',
templateUrl: './afdeling.component.html',
styleUrls: ['./afdeling.component.css']
})
export class AfdelingComponent implements OnInit {
afdeling: Afdelingen[];
errorMessage:string;
constructor(private afdelingService: AfdelingService, private patientService: PatientService) { }
ngOnInit() {
this.getData()
}
getData() {
this.afdelingService.getAfdelingen()
.subscribe(
data => {
this.afdeling = data;
console.log(this.afdeling);
}, error => this.errorMessage = <any> error);
}
}
und das html:
<ul>
<li *ngFor="let afd of afdeling">
{{afd.patientid}}
</li>
</ul>
Wie in den Fehlermeldungen angegeben, unterstützt ngFor
nur Iterables wie Array
, sodass Sie es nicht für Object
verwenden können.
veränderung
private extractData(res: Response) {
let body = <Afdelingen[]>res.json();
return body || {}; // here you are return an object
}
zu
private extractData(res: Response) {
let body = <Afdelingen[]>res.json().afdelingen; // return array from json file
return body || []; // also return empty array if there is no data
}
Denken Sie daran, Observables an async weiterzuleiten, wie *ngFor item of items$ | async
, Wo Sie versuchen, *ngFor item of items$
Zu verwenden, wobei items$
Offensichtlich ein Observable ist, weil Sie es mit $
Ähnlich notiert haben zu items$: Observable<IValuePair>
, und Ihre Zuweisung kann so etwas wie this.items$ = this.someDataService.someMethod<IValuePair>()
sein, das eine Observable vom Typ T zurückgibt.
Hinzu kommt ... ich glaube, ich habe eine Notation wie *ngFor item of (items$ | async)?.someProperty
verwendet
Du brauchst nur die async
Pipe:
<li *ngFor="let afd of afdeling | async"> {{afd.patientid}} </li>
verwenden Sie immer die Pipe async
, wenn Sie direkt mit Observables arbeiten, ohne das Abonnement explizit zu kündigen.
Ich war das gleiche Problem und wie Pengyy vorschlägt, ist das die Lösung. Vielen Dank.
Mein Problem in der Browserkonsole:
PortafolioComponent.html: 3 FEHLER: Fehler beim Versuch, '[object Object]' zu unterscheiden. Nur Arrays und Iterables sind erlaubt (…)
In meinem Fall war mein Code-Fix:
//productos.service.ts
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
@Injectable()
export class ProductosService {
productos:any[] = [];
cargando:boolean = true;
constructor( private http:Http) {
this.cargar_productos();
}
public cargar_productos(){
this.cargando = true;
this.http.get('https://webpage-88888a1.firebaseio.com/productos.json')
.subscribe( res => {
console.log(res.json());
this.cargando = false;
this.productos = res.json().productos; // Before this.productos = res.json();
});
}
}