Angular 2 / Rx对象转换问题

时间:2016-12-24 12:22:22

标签: angular generics typescript rxjs observable

我正在使用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”有装饰器,那些装饰器丢失了。

这是调试器所说的:

Object returned in JavaScript

当我显式创建“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:

enter image description here

您会看到我使用装饰器添加的一些私有属性。我的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敌人不会返回泛型类型?

感谢任何提示!圣诞快乐!

0 个答案:

没有答案