2017-10-24 21 views
0

メソッドgetItem()でidからArrayからオブジェクトを取得しようとしています。角4/IDで配列からデータを取得できません

import { Injectable } from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 

import { IItem } from './item'; 

@Injectable() 
export class ItemsService { 
    private _itemsUrl = './items.json'; 

    constructor(private _http:Http){} 

    getItems(): Observable<IItem[]> { 
    return this._http.get(this._itemsUrl) 
    .map((response: Response) => <IItem[]>response.json().itemsData) 
    } 

    getItem(id:number): Observable<IItem> { 
    return this.getItems() 
    .map(items => items.find(item => item.id === id)); 
    } 

} 

サービスはコンポーネントに注入されます。

import { Component, OnInit } from '@angular/core'; 
import { ActivatedRoute, Params } from '@angular/router'; 
import { ItemsService } from './items.service'; 
import { IItem } from './item'; 

@Component({ 
    selector: 'my-app', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.css'] 
}) 
export class AppComponent implements OnInit { 
    item: IItem; 

    constructor(
    private _ItemsService: ItemsService, 
    private route: ActivatedRoute 
    ) { } 

    ngOnInit(): void { 

    this._ItemsService.getItems().subscribe(items => console.log(items)) 

    this.route.params.forEach((params: Params) => { 
     let id = +params['id']; 
     this._ItemsService.getItem(id).subscribe(item => console.log(item)); 
    }) 
    } 
} 

エクスポートクラスIItem

export class IItem { 
    id?: number; 
    title?: string; 
    titleUrl?: string; 
} 

items.json: ngOnInit():ボイド{

{ 
    "itemsData" : [ 
    { 
     "id": 1, 
     "title": "Item 1", 
     "titleUrl": "item-1" 
    }, 
    { 
     "id": 2, 
     "title": "Item 2", 
     "titleUrl": "item-2" 
    }, 
    { 
     "id": 3, 
     "title": "Item 3", 
     "titleUrl": "item-3" 
    } 
    ] 
} 

私は私のコンポーネントの内部メソッドをテスト

this._ItemsService.getItems().subscribe(items => console.log(items)) //Works fine 

    this.route.params.forEach((params: Params) => { 
     let id = +params['id']; 
     this._ItemsService.getItem(id).subscribe(item => console.log(item)); // Undefined 
    } 

エディタでプロジェクトを作成しようとしましたが、それは動作しません - だから、

Here!

を申し訳ありませんが、どのように私は私ののgetItem方法で観察からidでオブジェクトを取得することができますか?

+0

をあなたの 'appModule'に' HttpClientModule'をインポートしていません。ドキュメントを参照してください:https://angular.io/guide/http – Orlandster

+0

HTTPのインポートは本当に十分だと思います.HTTPリクエストはgetItems()メソッドでうまく動作します。 –

+0

HTTPのインポートは本当に十分です、私のhttp要求がgetItems()メソッドでうまく動作するためです。 –

答えて

1

いくつかの問題が発生することがあります:

getItem(id:number): Observable<IItem> { 
    return this.getItems() 
    .map(items => items.find(item => item.id === id)); 
    } 
  1. idパラメータであり、このid
  2. item.idとは項目がジャストstring

すなわち番号がないではありませんNaN

  • ログとウィジェットを追加する参照してください。

  • +0

    getItems()は、オブジェクトの配列を返します。コンソールでは、Numbers値を持つプロパティ "id"を含むオブジェクトを見ることができるので、3つの仮定のどれも真ではないと思われます。 –

    +0

    唯一の理由は、item.id === id 'falseを返します。 – kemsky

    +0

    あなたは正しいです。その場合idはNaNですが、ObservablesではなくPromisesを使用してコードを再作成します。 –

    0

    問題は、マップ機能

    から来ていることは、これを試してみてください。

    getItem(id:number): Observable<IItem> { 
        return this.getItems() 
        .map((response: Response) => <IItem[]>response.json().itemsData.find(item => item.id === id)); 
    } 
    
    +0

    端末はエラーをスローします:タイプパラメータ 'T'のタイプ引数は、その使用から推論できません。型引数を明示的に指定することを検討してください。 型引数候補 'IItem []'は、候補 '応答'のスーパータイプではないため、有効な型引数ではありません。 プロパティ 'includes'がタイプ 'Response'にありません。 –

    関連する問題