2017-01-04 3 views
2

Kurzfassung: Ich habe angeblich einige Org-Objekte, die Klassenmethoden haben. Aber wenn ich meine Daten abrufe, sehe ich Objektinstanzen, keine Org-Instanzen. Ist dies das beste verfügbare Ergebnis? Oder kann ich mein Programm überzeugen, mir Org-Objekte zu geben?AngularJS 2 Ein Promise Resolution verliert Klassenidentität beim Fechen

DETAILS: Ich arbeite mit einer neuen Version von Angular 2. Mein Code ändert geringfügig einige Tutorial-Code. Hier ist ein Teil meiner 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)); 
} 

Hier ist ein Teil meiner 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; 
    } 

    }); 
} 

ich meine Daten über einen In-Memory-Service holen:

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] 

Und ist meine Org Klasse wie folgt:

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

    deepCopy(): Org { ... } 

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

Wenn ich meine Daten am Haltepunkt anschaue, sehe ich ein Objekt mit den Feldern (ID, Spender, Name), aber ohne Funktionen. Ich sehe dort auch keine Definition von Org - wenn ich "org instanceof Org" anrufe, bekomme ich einen Fehler, dass Org nicht gefunden werden kann. Und "typeOrg" ergibt "Objekt".

Ich möchte equals() usw. als Org-Klasse-Methode haben. Aber zur Zeit habe ich nur Javascript-Objekte, die wie Org nur durch Duck-Typ sind. Kann ich es besser machen?

Danke, Jerome.

Antwort

1

Konstruieren Sie die Org Instanz aus dem JSON.

Etwas wie:

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

Dann definieren, wie eine Org Instanz in der Klassendeklaration beispiel zu konstruieren:

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

Das ist für mich arbeiten. In meinem obigen Beispiel ändert sich die getOrgs(). Then() zu .then (response => response.json(). Data.map ((d: any) => neue Org (d)) als Org []). Ich danke dir sehr! –