2017-10-24 6 views
0

getItem() 메서드를 사용하여 ID로 배열에서 객체를 검색하려고합니다.각도 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" 
    } 
    ] 
} 

나는 내 구성 요소 내부의 방법을 테스트 그래서

Here!

, 어떻게 내 의 getItem 방법으로 관찰 가능한에서 ID로 객체를 검색 할 수 있습니다 죄송합니다 -

은 편집기에서 프로젝트를 만들려고했지만 작동하지 않습니다?

+0

을 당신은 당신의'appModule'에'HttpClientModule'를 가져 아닙니다. docs : 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

  • 더 많은 로그 및 wi 추가 알 겠어.

  • +0

    getItems()는 객체 배열을 반환합니다. 콘솔에서 Numbers 값을 가진 "id"속성을 포함하는 객체를 볼 수 있으므로 세 가지 가정 중 어느 것도 사실이 아닌 것처럼 보입니다. –

    +0

    나는 심각하게 의심합니다. 그 유일한 이유는 item.id === id입니다. '거짓을 반환합니다. – 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

    터미널에서 오류를 throw합니다. 형식 매개 변수 'T'의 형식 인수를 사용에서 유추 할 수 없습니다. 형식 인수를 명시 적으로 지정하는 것을 고려하십시오. 유형 인수 후보 'IItem []'은 (는) 유효한 'argument'의 상위 유형이 아니기 때문에 유효한 유형 인수가 아닙니다. '포함'속성이 '응답'유형에 없습니다. –