Angular 从FireBaseListObservable数组转到字符串数组

Angular 从FireBaseListObservable数组转到字符串数组,angular,typescript,firebase,rxjs,angularfire2,Angular,Typescript,Firebase,Rxjs,Angularfire2,编辑以包含更多详细信息: 假设我在Firebase中有一个测量对象集合,在Firebase中有一个SurveyTaker对象集合,还有一个surveyTakersBySurvey关系设置,如 +-- surveyTakersBySurvey | +-- survey1 | | | +-- surveyTaker1 = true | +-- survey2 | +-- surveyTaker1 = true 此代码目

编辑以包含更多详细信息:

假设我在Firebase中有一个测量对象集合,在Firebase中有一个SurveyTaker对象集合,还有一个surveyTakersBySurvey关系设置,如

+-- surveyTakersBySurvey
   |
   +-- survey1
   |    |
   |    +-- surveyTaker1 = true
   |
   +-- survey2
        |
        +-- surveyTaker1 = true
此代码目前有效

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) );
}
findSurveyByState(surveyState:string):可观察{
返回此.db.list('调查'{
查询:{
orderByChild:“状态”,
限制第一:1,
等号:测量状态
}
})
.map(结果=>结果[0]);
}
FindSurveyTakeySperSurveyState(surveyState:string,
查询:FirebaseListFactoryOpts={}):可观察{
返回此.findSurveyByState(surveyState)
.do(val=>console.log(“survey”,val))
.filter(调查=>!!调查)
.switchMap(survey=>this.db.list(`surveyTakersBySurvey/${survey.$key}`,查询))
.map(stsbs=>stsbs.map(stbs=>stbs.key));
}
我需要更改上面的代码,以适用于返回相同状态的多个调查

我正在努力与rxjs编程

//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) );
}
//我首先将其更改为返回多个
findSurveysByState(surveyState:string):可观察{
返回此.db.list('调查'{
查询:{
orderByChild:“状态”,
等号:测量状态
}
})
//.map(结果=>结果[0]);
}
//这是一种不起作用的方法
FindSurveyTakeySperSurveyState(surveyState:string,
查询:FirebaseListFactoryOpts={}):可观察{
//需要更新以进行多个调查
返回此。findSurveysByState(surveyState)
.do(val=>console.log(“调查”,val))
.filter(调查=>!!调查)
//.switchMap(survey=>this.db.list(`surveyTakersBySurvey/${survey.$key}`,查询))
//开关地图一次只对一个人有意义?
.map(surveys=>surveys.map(survey=>this.db.list(`surveyTakersBySurvey/${survey.$key}`,query)))
//在下面的行中,我得到[ts]属性“$key”不存在于类型“FirebaseListObservable”上。
.map(stsbs=>stsbs.map(stbs=>stbs.key));
}
我得到一个[未定义,未定义]

任何帮助都将不胜感激。如果我需要详细说明任何重要的事情,请告诉我。。我还在这里摸索着


编辑:this.db来自。。。从“angularfire2/database”导入{AngularFireDatabase}

使用
combinelatetest

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

当您console.log('stbss')时,它是否已经在数组的每个元素中包含
$key
?它打印两个FireBaseListObservable的数组。。。[FirebaseListObservable,FirebaseListObservable]。。。我不知道如何打印出来。如果你使用的是chrome控制台,你应该能够扩展并看到Eyea中的对象。这是一个大而疯狂的对象。0:FirebaseListObservable$ref:U{U:Qg,path:E,m:lf,Nc:false,然后:未定义,}操作符:ObserveOnOperator{scheduler:zonesScheduler,delay:0}来源:FirebaseListObservable{U isScalar:false,{U subscribe:ƒ,$ref:U}isScalar:false协议:observeIt似乎与this.db.list('foo',query)是相同的对象。。我只是不知道如何将它们映射到stringsWell数组,你太棒了。非常感谢。我还需要添加.map(stsbs=>stsbs.map(results=>results[0]).map(stbs=>stbs.$key));很高兴听到这个消息。
import 'rxjs/add/observable/combineLatest';
import { Observable } from 'rxjs/Observable';