Angular 2 - 转换响应为 Angular 模型的良好实践
Angular 2 - 转换响应为 Angular 模型的良好实践
在Angular 2中,将响应(例如json数据)转换为模型的良好做法是什么?换句话说,如何在Angular 2中实现自动映射功能。
team.service.ts
import { Injectable } from '@angular/core'; import { Http, Response } from '@angular/http'; import 'rxjs/add/operator/toPromise'; import { Team } from './team.model'; @Injectable() export class TeamService { constructor(private _http: Http) {} public GetAllTeams(): Promise{ return this._http.get('/app/teams/shared/team.data.json') .toPromise() .then(response => response.json().data as Team[]) .catch(this.handleError); } private handleError(error: any): Promise { console.error('An error occurred', error); return Promise.reject(error.message || error); } }
team.data.json
{
"data": [
{"id": "1", "name": "团队1", "otherProperty" : "S1"},
{"id": "2", "name": "团队2", "otherProperty" : "S2"}
]
}
team.model.ts
export class Team { private _id: string; public get id(): string { return this._id; } public set id(value: string) { this._id = value; } private _name: string; public get name(): string { return this._name; } public set name(value: string) { this._name = value; } private _icon: string; public get icon(): string { return this._icon; } public set icon(value: string) { this._icon = value; } }
`GetAllTeams`方法应返回`Team`对象数组。我知道我可以创建一个工厂,接收json数据并返回`Team`对象数组,但在阅读了这篇文章(https://angular.io/docs/ts/latest/guide/dependency-injection.html)后,我认为这是个不好的模式。谢谢。
在将响应转换为Angular模型时,出现了以下问题:不需要创建一个作为模型的类,如果你所需的是强类型,可以使用接口代替。使用接口的好处是你可以获得强类型,而接口不会生成额外的代码,而类会生成额外的代码。目前你所做的响应转换的方式我认为是不错的。
解决方法是:使用接口替代类来定义模型,这样可以获得强类型,不会生成额外的代码。
以下是解决方法的示例代码:
export interface Team { id: string; name: string; icon: stirng; someOtherProperty: []; } public GetAllTeams(): Promise{ return this._http.get('/app/teams/shared/team.data.json') .toPromise() .then(response => response.json()) .then(x => x.data); }
需要记住的是,TypeScript是JavaScript + 强类型,不要试图将所有面向对象的实现带入其中(尽管有时候很诱人)。
感谢使用接口而不是类在我的情况下似乎是合适的。