2017-12-15 3 views
0

Mit Angular 4, 5 hier auf dem neuesten Stand zu sein, habe ich mich gefragt, wie die JSON-Antwort auf ein stark typisiertes Objekt/Modell funktioniert.Mapping-Antwort auf Model - Best Practice

Service:

getUsers(): Observable<User[]> { 
    return this.http.get<User[]>('http://localhost:8000/users/') 
    .pipe(
     tap(users => this.log(`fetched users`)), 
     map(response => { 
     return response.map((res) => 
     { 
      return new Hero(
      response['username'], 
      response.email); 
     }); 
     }), 
     catchError(this.handleError('getUsers', [])) 
    ); 
} 

Schnittstelle/Modell:

export interface IUser { 

    id: number; 
    name: string; 
    email: string; 
} 

export class Hero implements User { 

    public id: number; 

    constructor(public name: string, 
      public email: string) { 

    } 
} 

Rückkehr ein beobachtbares Array mit Benutzerobjekten. username ist kein Member dieses Objekts, daher verwende ich diese Klammernotation, da die Punktnotation einen Fehler ergibt. Offensichtlich werde ich diese Map-Funktion schließlich in eine separate Funktion für Testbarkeit/Klarheit bringen.

Wie wird mit dieser Zuordnung/Neuzuordnung/Transfusion richtig umgegangen?

+0

können Sie es direkt an die Schnittstelle als 'return response' eingeben – Aravind

+0

Sie meinen' map (response => return response) ', Wie funktioniert dann' username' zu ​​'name'? Das ist im Grunde meine Frage in diesem einfachen Beispiel. –

Antwort

0

Sie geben sich zu viel Mühe.

export interface IUser { 
    id: number; 
    username: string; 
    email: string; 
} 

getUsers(): Observable<User[]> { 
    return this.http.get<User[]>('http://localhost:8000/users/') 
    .catch(err => this.handleError('getUsers', [])); 
} 

hier gehen Sie, ist Ihre Antwort eingegeben haben.

Siehe Typoskript als Entwicklung Hilfe. Es ist sehr nützlich, während des Codierens Klassen und ähnliches zu haben, aber sobald Sie Ihre Anwendung erstellt haben, wird alles nach Javascript kompiliert, wodurch alle Klassen und Eigenschaften verloren gehen.

Sie sollten nicht zu viel darüber nachdenken. Gehen Sie einfach für das einfachste, und es sollte funktionieren. Ansonsten haben Sie immer noch einen TS-Linter, um Ihnen zu sagen, wo Ihr Fehler liegt!

+0

Nun, das ist ein ziemlich triviales Beispiel für etwas komplexeres, das eine RESTful API mit anderen Eigenschaften als das FE ist. Ich verstehe und stimme Ihnen jedoch zu .. Ich bin auf der Suche nach dieser Best-Practice-Implementierung für das Mapping. –

+0

Es gibt keine "Best Practice-Implementierung für das Mapping": ** Sie verwenden Mapping, wenn Sie Daten ändern müssen **. Wenn Sie Ihre Antwort bei jedem Anruf auf Ihr Modell abstimmen müssen, ** ändern Sie Ihr Modell, um mit Ihrem Antwortmodell fertig zu werden **. Geben Sie einfach Ihren Anruf mit 'get ' und Ihre Funktion mit 'Observable '. Ansonsten müssen Sie keine neuen Elemente installieren, wie Sie es getan haben. Das verschwendet Zeit, Ressourcen und Codezeilen. – trichetriche