2017-10-10 13 views
1

私はTypeScriptとAngularの初心者ですので、この質問は奇妙かもしれません。 私は英雄のリストを返す単純なJSON持っている:私はGetByIdを実行するために私のサービスを必要とするが、ヒーローは常に未定義出てくる理由は、誰かが右の場所に私をポイントしてくださいすることができ、これは私は何である http://demo8521374.mockable.io/titan角度観測可能はjson配列結果をフィルタリングしません

をやって:

:私は、配列を参照することができ、私のコンソールに

 return this.http.get("http://demo8521374.mockable.io/titan").map((response: Response) => { 
 
      var result = response.json().heroes as Hero[]; 
 
      console.log(result); 
 
      return result; 
 
     }).filter(x => x.filter(x => x.id == id)).first().toPromise();

が印刷されたが、私のコンポーネントにして、オブジェクトを取得していません回の

ngOnInit(): void { 
 
     this.route.paramMap 
 
      .switchMap((params: ParamMap) => this.heroService.getHero(+params.get('id'))) 
 
      .subscribe(hero => this.hero = hero); 
 

 
     console.log(this.hero) 
 
    }

ありがとう!

答えて

1

は、次のようにコードを修正し、それは確かに良い方法があり、働いていた:

getHero(id: number): Promise<Hero> { 
 

 
     return this.http.get("http://demo8521374.mockable.io/titan").map((response: Response) => { 
 
      var result = response.json().heroes as Hero[]; 
 
      console.log(result); 
 
      return result; 
 
     }) 
 

 
      .map(heros => { 
 
       let y = heros.filter(x => x.id == id)[0] 
 
       console.log(y); 
 
       return y; 
 
      }) 
 
      .toPromise();

+0

これは行く方法です。 Observable.filter()は、イベントのデータではなく、_events_(!)をフィルタリングしています。だから、 '.map()'の中で '.filter()'を使うのはここでは間違いありません。 –

0

switchMapは新しい観測値を返しますが、getHeroメソッドも観測可能値を返します。次のようにその場合は、あなたのヒーロープロパティに割り当てるgetHero観測可能となりましたswitchMap観測可能に加入する必要があります。

ngOnInit(): void { 
     this.route.paramMap 
      .switchMap((params: ParamMap) => this.heroService.getHero(+params.get('id')) 
      .subscribe(hero => this.hero = hero)); 

     console.log(this.hero) 
    } 

それともgetHeroは約束を返している場合は、次のように、それはなります。

あなたがやっていることが少し不明で、あなたがObservablesとNeedsだけを必要としていると思われるときにObservablesとPromisesを混在させているように見えますが、この質問に対する答えを禁じるのは難しいです。

Updateサービスへ:

return this.http.get("http://demo8521374.mockable.io/titan").map((response: Response) => { 
      var result = response.json().heroes as Hero[]; 
      console.log(result); 
      return result; 
     }).filter(x => x.id === id).first().toPromise(); 
+0

感謝しますが、これは助けにはなりませんでした、問題はコンポーネントではなくサービスにあります.Hero約束を手動で作成し、それが動作するサービスから返すときです。 – TomerMiz

+0

@TomerMiz更新された回答を参照してください。あなたのフィルタが間違っているようです。フィルターメソッドに渡す述部は、配列内の各項目に対して1回実行されます。まるで配列の各項目を配列そのものとして扱っているかのようです。 – peinearydevelopment

関連する問題