2017-10-19 5 views
0

角度4とサーバー側のレンダリングから始めていますが、現在、私は外部APIのデータの一部をフェッチする概念を取得しようとしています。そのAPIはJsonオブジェクトを返します。角度4のデータをフェッチする

サイトはかなり上手く描かれていましたが、レンダリングされていないデータを取得する呼び出しが含まれるようになりました。私が得ようとしているレスポンスは、 app.components.tsで

は、私が追加:

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; 
    }) 
    } 

さて、あなたはしかし、私はこれを取得しています、私はコンソールでHTTP呼び出しの結果を印刷していますgetDataメソッドでは、見ることができるように。

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

なぜjsonオブジェクトが表示されないのですか?それは理由だろうか?

+0

これは正しい。あなたの 'res'は実際には' Observable'であり、データそのものではありません。オブザーバブルは非同期です。実際のデータを見るには 'console.log'を' subscribe() 'で実行してください。コールバック関数を呼び出すか、 'map'コールバック関数の中でそれを見ることができます。 – CozyAzure

答えて

4

getUsers()は内部的にgetDataを呼び出しているので、コンストラクタ内でもう一度呼び出す必要はありません。また

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

実際のデータを参照する方法をサブスクライブの内側にconsole.logを置き、以下のコメントが言うように、内部のあなたのメソッド呼び出しを持つことが推奨されていません

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

EDITコンストラクタ、ngOnitを実装してメソッドを内部に追加するようにコンポーネントを作成する

+1

これを追加するには...コンストラクタで非同期操作を実行することはお勧めしません。代わりに、ngOnInitライフサイクルフックメソッドを使用します。さらに、データアクセスを独自のサービスに移動することが通常は推奨されています。私は完全な例をここに持っています:https://github.com/DeborahK/Angular-GettingStarted(APM-Finalフォルダ内) – DeborahK