2017-02-20 4 views
1

私はObservablesを使用してAngular 2アプリでデータを取得しています。今のところ、いくつかのサービス/コンポーネントがほぼ同じことをしているので、リファクタリングでこの「DRYer」を作成したいので、コンポーネントで行っているAPI呼び出しとは異なる1つのパラメータを渡すだけです。そうすれば、私はこれを必要とするコンポーネントのそれぞれに対して1つのサービスを使用できます。Observablesを使用して角2アプリで渡された変数を使用する関数を変換する

私が最初に(比較のために)働いているものをお見せしましょう:私のサービスで

を私はこれを持っていた:

getByCategory() { 
    this._url = "https://api.someurl.com/v0/contacts/group/staff?limit=15&apikey=somekey"; 
    return this._http.get(this._url) 
     .map((response: Response) => response.json()) 
     .catch(this._errorsHandler); 
} 
_errorsHandler(error: Response) { 
    console.error(error); 
    return Observable.throw(error.json().error || 'Server error'); 
} 

そして、私のコンポーネントで、私はこのようにこれに加入した:

this.contactService.getByCategory() 
    .subscribe(resRecordsData => this.records = resRecordsData, 
     responseRecordsError => this.errorMsg = responseRecordsError); 

上記のコードはすべて改めて動作しています。

しかし、さまざまなコンポーネントからの呼び出しの間で違うの唯一のものは、API呼び出しに一つのパラメータ(グループ)であるので、私はそれのようなものにするためにリファクタリングしたいと思います:

getByCategory(group) { 
    const q = encodeURIComponent(group); 
    this._url = "https://api.someurl.com/v0/contacts/group/${q}?limit=15&apikey=somekey"; 
    return this._http.get(this._url) 
     .map((response: Response) => response.json()) 
     .catch(this._errorsHandler); 
} 
_errorsHandler(error: Response) { 
    console.error(error); 
    return Observable.throw(error.json().error || 'Server error'); 
} 

そして、コンポーネントに私はまた、このように、コンポーネントごとに違うの1つのグループのパラメータを渡しながら、これに加入するだろう:私はこれをしようとすると

this.contactService.getByStage('staff') 
     .subscribe(resRecordsData => this.records = resRecordsData, 
     responseRecordsError => this.errorMsg = responseRecordsError); 

、私はすべてのエラーを得ることはありませんが、また、Iドンビューに印刷されたデータを取得しません。この関数の変換で私がここで欠けているものがありますか?

+0

これは動作するはずです。 this._urlをログに記録するとどうなりますか? – chrispy

+0

私はこれを受け取ります: "https://api.someurl.com/v0/contacts/group/${q}?limit=15&apikey=somekey" – Muirik

+0

$ {q}が正しく補間されていないようですか?私はあなたがあなたの事例で「職員」であることを望む気がします。 – chrispy

答えて

0

答えは、APIに渡されたURLで補間が使用されているため、urlは引用符ではなくバッククォートを使用する必要があるということです。

this._url = `https://api.someurl.com/v0/contacts/group/${q}?limit=15&apikey=somekey`; 
関連する問題