angular - Gå från Array av FirebaseListObservables till Array av Strängar
REDIGERAD FÖR ATT INKLUDERA MER DETALJ:
Låt oss anta att jag har en samling av Survey-objekt i Firebase, och en samling av SurveyTaker-objekt i Firebase, och en surveyTakersBySurvey-relation uppsatt som
+-- surveyTakersBySurvey
|
+-- survey1
| |
| +-- surveyTaker1 = true
|
+-- survey2
|
+-- surveyTaker1 = true
Denna kod fungerar för närvarande
findSurveyByState(surveyState:string): Observable<Survey> {
return this.db.list('surveys', {
query: {
orderByChild: 'state',
limitToFirst: 1,
equalTo: surveyState
}
})
.map(results => results[0]);
}
findSurveyTakerKeysPerSurveyState(surveyState:string,
query: FirebaseListFactoryOpts = {}): Observable<string[]> {
return this.findSurveyByState(surveyState)
.do(val => console.log("survey",val))
.filter(survey => !!survey)
.switchMap(survey => this.db.list(`surveyTakersBySurvey/${survey.$key}`,query))
.map( stsbs => stsbs.map(stbs => stbs.$key) );
}
Jag behöver ändra koden ovan för att fungera för flera undersökningar som returneras med samma tillstånd.
Jag har problem med rxjs-programmering...
//i first changed this to return multiple
findSurveysByState(surveyState:string): Observable<Survey[]> {
return this.db.list('surveys', {
query: {
orderByChild: 'state',
equalTo: surveyState
}
})
//.map(results => results[0]);
}
// this is the method that is not working
findSurveyTakerKeysPerSurveyState(surveyState:string,
query: FirebaseListFactoryOpts = {}): Observable<string[]> {
//need to update to take multiple Surveys
return this.findSurveysByState(surveyState)
.do(val => console.log("surveys",val))
.filter(survey => !!survey)
//.switchMap(survey => this.db.list(`surveyTakersBySurvey/${survey.$key}`,query))
// switchMap would only make sense for one at a time?
.map(surveys => surveys.map(survey => this.db.list(`surveyTakersBySurvey/${survey.$key}`, query)))
// on the below line i get [ts] Property '$key' does not exist on type 'FirebaseListObservable<any[]>'.
.map( stsbs => stsbs.map(stbs => stbs.$key) );
}
Jag får en [undefined, undefined]
All hjälp skulle uppskattas. Låt mig veta om jag behöver förklara något viktigt.. jag håller fortfarande på att lära mig här.
REDIGERA: this.db är från ... import { AngularFireDatabase } från "angularfire2/database";
Svar #1
Använd combineLatest.
findSurveyTakerKeysPerSurveyState(surveyState:string,
query: FirebaseListFactoryOpts = {}): Observable<string[]> {
//need to update to take multiple Surveys
return this.findSurveysByState(surveyState)
.do(val => console.log("surveys",val))
.filter(survey => !!survey)
//.switchMap(survey => this.db.list(`surveyTakersBySurvey/${survey.$key}`,query))
// switchMap would only make sense for one at a time?
.switchMap(surveys => {
let observables = [];
surveys.forEach(survey => {
observables.push(this.db.list(`surveyTakersBySurvey/${survey.$key}`, query));
});
return Observable.combineLatest(observables);
})
.map( stsbs => stsbs.map(stbs => stbs.$key) );
}
Du kan behöva importera dessa två rader.
import 'rxjs/add/observable/combineLatest';
import { Observable } from 'rxjs/Observable';
