2017-06-22 3 views
0

Wie der Titel, ich bin das Abrufen eines Mitglieds Profil von Firebase mit der database.object Methode und Abonnieren, dass im Profile View-Controller einer Angular 4 App.Wie wird ein transformiertes Objekt von einer beobachtbaren Firebase zurückgegeben, wobei ein verschachtelter Wert von einer anderen beobachtbaren Firebase zurückgegeben werden muss?

Derzeit kann ich alle diese Profilinformationen gut erhalten, und die Daten sind in meinem Firebase-Controller mutiert.

Für einige Hintergrund:

  • In meinem Profil Objekt, gibt es eine ID eines Admin-Benutzer, die für einige Updates für das Profil
  • Mit Hilfe dieser ID verantwortlich war, muss ich von einem Benutzerobjekt packen Feuerbasis, die Dinge wie das Admin-Benutzernamen enthält, der die Änderung

Hier ist ein Beispiel für reduzierte gemacht, was ich tue:

firebase.controller.ts

public getMemberProfile(id: string): Observable <IProfile> { 
    return this.database.object(`${MEMBERS_PATH}/${id}`).map(member => this.transformMember(member)) 
} 

public getAdminUser(id: string): Observable <IUser> { 
    return this.database.object(`${USERS_PATH}/${id}`).map(user => user) 
} 

private transformMember(member): IProfile { 
    return { 
    aboutUserObj: this.getAdminUser(member.adminUserId).subscribe((adminUser)=> { 
     return adminUser // Of course this does NOT work 
    }), 
    // Other stuff 
    } 
} 

profile.controller.ts

this.memberFirebase.getMemberProfile(this.id).subscribe((profile) => { 
    this.profile = profile 
}) 

Wie Sie hoffentlich von dem reduzierten Fall sehen, es ist eine Voraussetzung dafür ist, dass ich das Element zu laden, dann verwenden Das Member-Objekt, um die ID zu erhalten, die ich brauche, um den Admin-Benutzer zu erhalten, den ich aufnehmen muss, um Updates für dieses Profil in der Ansicht aufzulisten.

Die Frage

Wie kann ich das Element erfolgreich geladen und anschließend weitere Benutzerinfos von Firebase, um zurückzukehren, dass alle als eine beobachtbare, welche das vollständige mutierte Profil enthält?

Ich bin besonders interessiert zu wissen, wie 'Best Practice' für diese Art von Szenario aussehen könnte.

Vielen Dank im Voraus! Ich hoffe, das ist klar genug, wenn nicht, bitte zögern Sie Verbesserungsvorschläge.

+0

Gehen Sie durch das Problem aber noch nicht klar, was wollen Sie genau? –

Antwort

1

Sie wollen so etwas wie flatMap so dass Sie die Observablen Kette

this.getMemberProfile(id).flatMap(
    res => { 
     // get id from res of first observable 
     let adminId = res.id; 

     return this.getAdminUser(adminId); 
    } 
) 
.map(res => { 
    // do other transformation as needed 
    return res; 
}) 

Dann würden Sie auf diese gekettet beobachtbaren Sequenz abonnieren.

Hier ist eine gute Ressource auf flatMap ist https://coryrylan.com/blog/angular-multiple-http-requests-with-rxjs

+0

Ausgezeichnet, nur das Ticket. Ich habe das auf Umwegen umgesetzt und es funktioniert erwartungsgemäß. Vielen Dank! Hoffen wir, dass dies jemand anderem helfen kann, mit Observablen zu experimentieren :) – gdgr

Verwandte Themen