2017-10-19 3 views
0

Ich beginne mit eckigen 4 und serverseitigen Rendering, derzeit versuche ich einen Proof of Concept holen einige Daten von einem meiner externen APIs. Diese API gibt ein Json-Objekt zurück.Abrufen von Daten in Angular 4

Die Seite wurde ziemlich gut gerendert, aber jetzt, wo ich den Aufruf zum Abrufen von Daten aufgenommen habe, wird es nicht gerendert und die Antwort, die ich bekomme, scheint nicht das zu sein, was ich bekommen sollte.

In den app.components.ts fügte ich hinzu:

private apiUrl= 'https://myapi/Users'; 
    data: any = {}; 

    constructor(private http: Http){ 
    this.getUsers(); 
    this.getData(); 
    } 

    getData(){ 
    let res=this.http.get(this.apiUrl).map((res: Response)=>res.json()); 
    console.log("result:",res) 
    return res; 
    } 

    getUsers(){ 
    this.getData().subscribe(data=>{ 
     this.data=data; 
    }) 
    } 

Nun, wie Sie in der GetData-Methode sehen kann ich das Ergebnis der http Anrufe in Konsole Druck bin, aber ich dies immer:

Observable { 
    _isScalar: false, 
    source: Observable { _isScalar: false, _subscribe: [Function] }, 
    operator: MapOperator { project: [Function], thisArg: undefined } } 

Warum bekomme ich nicht das Json-Objekt? Was könnte der Grund sein?

+0

Das ist richtig. Ihre "Res" ist eigentlich ein "Observable", nicht die Daten selbst. Observables sind asynchron. Um die echten Daten zu sehen, 'console.log' es an Ihrem' subscribe() '. Rückruf-Funktion, oder Sie können es in Ihrer 'Karte' Callback-Funktion sehen. – CozyAzure

Antwort

4

Da getUsers() intern getData aufruft, müssen Sie den Konstruktor nicht erneut aufrufen.

constructor(private http: Http){ 
    this.getUsers(); 
    //remove this line this.getData(); 
} 

auch die console.log platzieren innerhalb der Methode zeichnet die aktuellen Daten, um zu sehen,

getUsers(){ 
    this.getData().subscribe(data=>{ 
     this.data=data; 
     console.log(this.data); 
    }) 
    } 

EDIT Wie der folgende Kommentar sagt, ist es nicht Ihren Methodenaufruf empfohlen, im Innern zu haben Konstruktor, machen Sie Ihre Komponenten zu implementieren ngOnit und fügen Sie die Methode innerhalb

+1

Um hinzuzufügen ... es wird nicht empfohlen, asynchrone Operationen im Konstruktor auszuführen. Verwenden Sie stattdessen die ngOnInit Lebenszyklus-Hook-Methode. Außerdem wird normalerweise empfohlen, den Datenzugriff in seinen eigenen Dienst zu verschieben. Ich habe ein komplettes Beispiel hier: https://github.com/DeborahK/Angular-GettingStarted (im APM-Final-Ordner) – DeborahK

Verwandte Themen