我正在使用Angular 2.4.0和Rx 5.0.0。
我在注射服务中使用以下函数从服务中获取数据:
public getStudy(id: number): Rx.Observable<Array<StudyViewModel>> {
return this.http
.get(this.seviceUrls.repositoryService + id)
.map((res: Response) => res.json())
.catch((errors: any) => Rx.Observable.throw(errors.json().error || 'Server error'));
}
虽然这有效,但返回的对象是“object”类型。我期待得到一个“StudyViewModel”类型的对象。属性是正确的,对象确实包含预期的数据。但我的“StudyViewModel”有装饰器,那些装饰器丢失了。
这是调试器所说的:
当我显式创建“StudyViewModel”类型的新对象并返回此对象时,会出现预期的类型。我实际上有这个代码来创建一个浅拷贝:
public getStudies(): Rx.Observable<Array<StudyViewModel>> {
return this.http
.get(this.seviceUrls.repositoryService)
.map((res: Response) => {
// force internal viewmodel type, required to access private decorators
let model = <Array<StudyViewModel>>(res.json());
let viewModel = new Array<StudyViewModel>();
for (let i = 0; i < model.length; i++) {
viewModel.push(new StudyViewModel(model[i]));
}
return viewModel;
})
.catch((errors: any) => Rx.Observable.throw(errors.json().error || 'Server error'));
}
现在我得到了我想要的东西,即使在调试器视图中使用JavaScript:
您会看到我使用装饰器添加的一些私有属性。我的viewmodel看起来像这样(只是为了完成故事):
export class StudyViewModel {
constructor(source?: {}) {
const obj = {} as StudyViewModel;
// source can be any json
for (var p in source) {
if (obj.hasOwnProperty(p)) {
this[p] = source[p];
}
}
}
id: number;
@Display("Short Name", "This is the short name")
@Required()
@MaxLength(28)
shortName: string;
}
装饰器创建我稍后用来解析内容的隐藏属性。这就是为什么我需要“我的”viewmodel,而不是实际从服务器发送的对象。
我错过了什么?为什么Observable敌人不会返回泛型类型?
感谢任何提示!圣诞快乐!