2017-07-19 32 views
0

コンポーネントにデータを返してから、サービスからのデータを持つルートをパラメータとして渡そうとしています。私はobservablesを間違って使用していると思うし、データを購読者に返すことができない場合や、サービスプロバイダからのルーティングを開始する必要があるかどうか混乱していると思います。サービスプロバイダからのルートをトリガーする問題は、scopeがextractData内で変更されることです。 extractData()内からthis.routerにアクセスできますか?更新角度で観測可能なデータを返す

コンポーネント:

private dataFromServer: ShortFormModel; 
onSubmit(shortForm: any) { 
    if (!shortForm) { return; } 
    const formModel = this.shortForm.value; 
    this.shortFormService.create(formModel) 
    .subscribe(body => { this.dataFromServer = body; console.log(body) }) 
    }) 
} 

サービスプロバイダ:

create(shortForm: any): Observable<ShortFormModel> { 
let headers = new Headers({'Content-Type': 'application/json'}); 
let options = new RequestOptions({headers: headers}); 

return this.http.post(this.preCheckUrl, shortForm, options) 
    .map((res) => this.extractData(res)) 
    .catch(
    (error: any): Promise<any>=> { 
    this.router.navigate(['/error', error]); 
    return Promise.reject(error.message || error); 
    } 
) 
} 

private extractData(res: Response) { 
    let body = res.json(); 
    this.router.navigate(['/apply', body.appId]) 
    return body|| { }; 
} 

応答ペイロード:

{ 
    "offer":{ 
    "id":null, 
    "amount":null, 
}, 
"dupes":true, 
"appId":53 
} 
コンポーネントは、上のフォームを提出し、このように設定されています

答えて

2

.map(this.extractData) 

範囲はextractDataの内側に変化している使用するときは、確かに正しいです。このように範囲を保持するために、ラムダ/太字矢印の関数内でthis.extractDataへの呼び出しをラップする必要があります:

.map((res) => this.extractData(res)) 
+0

完璧な、それは動作します!私の質問の他の部分については、どのように私はコンポーネントにデータを返すだろうか?今、私が応答にアクセスすることができる唯一の方法は、extractDataからです。 ; this.router.navigate([」 '.subscribe(RES => { this.componentProperty = RES:あなたはこのように、サブスクライブ法の成功コールバック内から観察可能な "内" からのデータにアクセスすることができます – Anthony

+1

/apply '、res]) } ' – Karsten

+0

これは意味がありますが、サブスクリプションの' res 'は応答であっても空のオブジェクトに過ぎません。上記の私の更新された実装を見てください。 – Anthony

関連する問題