私はかなり角度のあるシーンに新しいです、そして、私はいくつかの予期しない振る舞いから私の髪を引っ張り出しています。角度 - サービスのオブザーバー
私は、このコールがルートからページロードで2回実行されている方法を停止することができます
queryList(): Observable<ApiList[]> {
if(this.loadingApiList == true) {
return Observable.of(this.queryListResult);
}
this.loadingApiList = true;
return this._http
.get('samples/apiList.json').map((response: Response) => <ApiList[]> response.json())
.do(data => {
this.queryListResult = data;
});
}
私IntegrationsServiceに次のコードを持っていますか?
コンポーネントは、このメソッドを呼び出し、ナビゲーション中にリストを作成し、また、別のコンポーネントには、以下の方法で同じサービスを呼び出します。
getApiName(IT_ID:number) {
console.log(this.queryListResult);
let obj = this.queryListResult.find(o => o.IT_ID == IT_ID);
if(obj) {
return obj.IT_Name;
}
return false;
}
私が使用したときに、私はしかし、ルートを使用していないとき、これは完璧に動作しますルートのgetApiNameは未定義の結果を返します。
解決オブジェクトも使用しましたが、問題は解決しましたが、jsonファイルに2つの呼び出しが行われました。これは私が使用したものです。
resolve(route: ActivatedRouteSnapshot, state:RouterStateSnapshot):Observable<any>{
return this._service.queryList() // We need this to finish first.
}
は、私は本当に今こだわって - 私はそれが決意を使用して作業を取得することができますが、それは.jsonを2回呼び出しを持つ無駄です。
これを行う正しい方法は何ですか?
フラグを設定しても、操作が完了してクエリリストの結果が割り当てられているとは限りません。これを達成する1つの方法は、データを被験者ベースの観測可能なものに暴露し、フェッチを一度トリガすることである。 https://blog.jonrshar.pe/2017/Apr/09/async-angular-data.htmlここでは、このパターンをどのように使用したかを示します。 – jonrsharpe