RXJS过滤器和地图不返回任何东西

时间:2019-03-29 14:21:53

标签: javascript angular firebase rxjs

我正在尝试从Firebase获取信息并使用Rxjs 6对其进行过滤。

对此我有几个问题:

  1. 我通过uid读取对象并获取信息。在此对象中,我有收藏夹,我试图从收藏夹中过滤出一个特定的uid。但我认为,因为无法过滤其对象数组,所以我仅将喜欢的对象从firebase中加载。
  2. 当我使用管道和过滤器时,ts中出现错误。问题是:类型'any []'上不存在属性'uid'。 我可以使用// @ ts-ignore进行编译。无论如何,我从rxjs那里一无所获。
  3. 当我在过滤器中使用地图时,出现以下问题:data.favorite.filter不是一个函数(在Web控制台中)。

数据库结构:

profile{
 NAg0E9IXrjeKMw3tLxPrlyvcdBr2{
        name:david,
        age:20,
        favorite{
                  NHXL2LD5LIfgdfvr{
                                   name:mike,
                                   uid:gh4Q0OEfNHXL2LD5LIgFpVmdmm92
                                  }
                  Q0OEfNHX2LD5Ldsdv{
                                   name:ron,
                                   uid:Vmdmm92dNHXL2LD5LIgFpEfNHXL2
                                   }
                 }
        }
 gh4Q0OEfNHXL2LD5LIgFpVmdmm92{
        name:mike,
        age:26,
        favorite{
                  rlyvcdBr25LdsIXrdv{
                                   name:david,
                                   uid:NAg0E9IXrjeKMw3tLxPrlyvcdBr2
                                   }
                 }
        }
}

服务代码:

  getDataObj(objpath:string){
    this.objRef = this.db.object(objpath);
    this.obj = this.objRef.valueChanges();
    return this.obj;
   } 

   getDataList(listpath:string){
    this.itemsRef = this.db.list(listpath);
    this.items = this.itemsRef.snapshotChanges().pipe(
      map(changes => 
        changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
      )
    );
  return this.items;

组件代码:

//Here I get Problem 3
   this.db.getDataObj("/Profile/" + this.uid).pipe(
map(data => data.favorite.filter((res) => res.uid===this.uid))).subscribe(res=>console.log(res));

//Here I get Problem 2
      this.db.getDataList("/Profile/" + this.userAuth.uid + "/favorite").pipe(filter(data => data.uid == this.uid)).subscribe(res => {                                  
          console.log(res)}); 

如果我确实进行过滤,那么它对我有用:

      this.db.getDataList("/Profile/" + this.userAuth.uid + "/favorite").subscribe(res => {                                  
          console.log(res.filter(names =>names.uid == this.uid));
          console.log(res)}); 

谢谢

0 个答案:

没有答案