angular - AngularJS 2 en Promise-lösning förlorar klassidentitet vid hämtning


SAMMANFATTNING: Jag ska tydligen hämta några Org-objekt som har klassmetoder. Men när jag hämtar mina data ser jag Object-instansier, inte Org-instansier. Är detta det bästa tillgängliga resultatet? Eller kan jag övertala mitt program att ge mig Org-objekt?

DETALJER: Jag arbetar med en nyare version av Angular 2. Min kod modifierar lite några tutorials-kod. Här är en del av min 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));
}

Här är en del av min resolver:

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;
    }

  });
}

Jag hämtar mina data genom en tjänst i minnet:

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]

Och min Org-klass ser ut så här:

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

  deepCopy(): Org { ... }

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

När jag tittar på mina data vid brytpunkten ser jag ett objekt som har fälten (id, donor, name) men inga funktioner. Jag ser inte heller någon definition av Org där -- om jag kallar på "org instanceof Org" får jag ett fel att Org inte kan hittas. Och "typeof org" ger "object".

Jag önskar att ha equals(), etc., som en metod i Org-klassen. Men för närvarande har jag bara Javascript-objekt som liknar Org enbart genom duck-typing. Kan jag få bättre resultat av det?

Tack, Jerome.

Svar #1

Skapa Org-instansen från JSON.

Något som:

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

Definiera sedan hur man konstruerar en Org-instans i klassdeklarationen t.ex:

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;
  }
  ...
}