AngularJS 2一个Promise解决方案在fe

时间:2017-01-04 23:56:51

标签: angular typescript promise angular-promise

内容: 我应该获取一些具有类方法的Org对象。但是当我获取数据时,我看到了对象实例,而不是Org实例。这是最好的结果吗?或者我可以说服我的程序给我Org对象吗?

详情: 我正在使用最新版本的Angular 2.我的代码稍微修改了一些教程代码。这是我的org.service.ts的一部分:

getOrgs(): Promise<Org[]> {
  return this.http
    .get(this.orgUrl)
    .toPromise()
    .then(response => response.json().data as Org[])
    .catch(this.handleError);
}

getOrg(id: number): Promise<Org> {
  return this.getOrgs()
    .then((orgs: Org[]) : Org => orgs.find(org => org.id === id));
}

这是我的解析器的一部分:

resolve(route: ActivatedRouteSnapshot): Promise<Org>|boolean {
  let id = this.authService.user.orgId;

  return this.orgService.getOrg(id).then((org: Org) : Org|boolean => {

    if(org) { // <-- Breakpoint here
      return org;
    } else { 
      // If  the Org isn't available then the edit page isn't appropriate.
      this.router.navigate(['/provider/home']);
      return false;
    }

  });
}

我通过内存服务获取数据:

export class InMemoryDataService {

  createDb() {
    let org1 = new Org();
    org1.id = 12;
    org1.donor = true;
    org1.name = 'Great Actors Theater';
    let org2 = new Org();
    org2.id = 19;
    org2.donor = false;
    org2.name = 'Sunnyside Group Home';
    let org: Org[] = [];
    org.push(org1);
    org.push(org2);
[SNIP]

我的Org课程是这样的:

export class Org {
  id: number;
  donor: boolean;
  name: string = "";

  deepCopy(): Org { ... }

  equals(other: Org): boolean { ... }
}

当我在断点处查看我的数据时,我看到一个具有字段(id,donor,name)但没有函数的对象。我也没有看到Org的定义 - 如果我打电话给&#34; org instanceof Org&#34;我收到一个无法找到Org的错误。 &#34; typeof org&#34;收益&#34;对象&#34;。

我希望将equals()等作为Org类方法。但是目前我只有通过duck-typing只有喜欢组织的Javascript对象。我能改善它吗?

谢谢, 杰罗姆。

1 个答案:

答案 0 :(得分:1)

从JSON构建Org实例。

类似的东西:

.then(response => {
   // validate response
   return response.json().data.map(d => new Org(d))
})

然后定义如何在类声明中构造Org实例,例如:

export class Org {
  id: number;
  donor: boolean;
  name: string = "";

  constructor(data: any) {
     // validate data
     this.id = data.id;
     this.donor = data.donor;
     this.name = data.name;
  }
  ...
}