2016-05-18 33 views
7

Próbuję uzyskać zrozumienie, jak zmapować wynik z wywołania usługi na obiekt za pomocą http.get i Observables w Kątowymi 2.Jak zmapować odpowiedź z http.get na nową instancję wpisanego obiektu w Angular 2

Spójrz na tego Plunk

w sposobie getPersonWithGetProperty Czekam na powrót do zaobserwowania typu PersonWithGetProperty. Jednak! Nie mogę uzyskać dostępu do właściwości fullName. Sądzę, że musiałbym utworzyć nowe wystąpienie klasy PersonWithGetProperty i odwzorować odpowiedź na ten nowy obiekt przy użyciu konstruktora klasy. Ale jak to zrobić w metodzie getPersonWithGetProperty?

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

export class PersonWithGetProperty { 
    constructor(public firstName: string, public lastName: string){} 

    get fullName(): string { 
    return this.firstName + ' ' + this.lastName; 
    } 
} 

@Injectable() 
export class PersonService { 
    constructor(private http: Http) { 
    } 

    getPersonWithGetProperty(): Observable<PersonWithGetProperty> { 
     return this.http.get('data/person.json') 
     .map((response: Response) => <PersonWithGetProperty>(response.json())); 
    } 
} 

Odpowiedz

15

Problem polega na tym, że zmuszasz sparsowanego jsona do zachowywania się jak klasa.

Zastosowanie <PersonWithGetProperty> nie tworzy nowej instancji PersonWithGetProperty, tylko nakazuje kompilatorowi zamknięcie, ponieważ wiesz, co robisz. Jeśli chcesz utworzyć instancję PersonWithGetProperty, musisz ją zbudować za pomocą new.

szczęście jesteś już w połowie drogi, po prostu dodaj kolejną map po jego analizowany wyjście:

@Injectable() 
export class PersonService { 
    constructor(private http: Http) { 
    } 

    getPersonWithGetProperty(): Observable<PersonWithGetProperty> { 
     return this.http.get('data/person.json') 
     .map((response: Response) => response.json()) 
     .map(({firstName, lastName}) => new PersonWithGetProperty(firstName, lastName)); 
    } 
} 
+0

Dziękuję za wyjaśnienie rzeczy dla mnie! –

+0

Co zrobić, jeśli masz bardzo złożony obiekt lub obiekt, którego nie można skopiować za pomocą tylko jego konstruktora? Obiekt bez konstruktora, na przykład. –

+1

@ CarlosAdrián, a następnie używasz fabryki obiektów lub zamawiasz metody, które chcesz użyć na obiekcie. – paulpdaniels