Angular2 HTTP GET - 将响应转换为完整对象

时间:2016-03-15 14:30:06

标签: typescript angular

我有这个简单的组件

import {Component} from 'angular2/core';
import {RouterLink, RouteParams} from 'angular2/router';
import {Http, Response, Headers} from 'angular2/http';
import {User} from '../../models/user';
import 'rxjs/add/operator/map';


@Component({
    template: `
        <h1>{{user.name}} {{user.surname}}</h1>
    `,
    directives: [RouterLink],
})
export class UserComponent {

    user: User;

    constructor(private routeParams: RouteParams,
        public http: Http) {
            this.user = new User();
            this.http.get('http://localhost:3000/user/' + this.routeParams.get('id'))
                .map((res: Response) => res.json())
                .subscribe((user: User) => this.user = user);
        console.log(this.user);
    }
}

为什么subscribe没有将响应转换为完整的User对象。当我记录user变量时,我的控制台会说User {_id: undefined, name: undefined, surname: undefined, email: undefined}。但是,在视图中绑定到.name.surname的工作正在进行中。

这里发生了什么?用户实际存储在哪里?

3 个答案:

答案 0 :(得分:18)

良好做法是使用

从GET响应中使用数据
Observable<Model>

(关于Angular文档https://angular.io/guide/http) 所以......

//进口

import {HttpClient} from "@angular/common/http";

//在构造函数参数列表中

private http: HttpClient

//服务方法

getUser(): Observable<User> {return this.http.get<User>({url}, {options});}

您无需再做任何其他事情。我认为这种方法最友好。

答案 1 :(得分:17)

在此处找到解决方案:https://stackoverflow.com/a/29759472/2854890

我的方法现在看起来像这样:

constructor(private routeParams: RouteParams,
    public http: Http) {
    this.user = new User();
    this.http.get('http://localhost:3000/user/' + this.routeParams.get('id'))
        .map((res: Response) => res.json())
        .subscribe((json: Object) => {
            this.user = new User().fromJSON(json);
        });
}

我通过最后返回对象来增强Serializable,所以我可以省略类似

的内容
var u = new User();
u.fromJSON(...);

然后写下

new User().fromJSON(json);

Serializable

export class Serializable {

    fromJSON(json) {
        for (var propName in json)
            this[propName] = json[propName];
        return this;
    }

}

答案 2 :(得分:0)

TypeScript不支持。

有关详细信息,请参阅How do I cast a JSON object to a typescript class