AngularFire2使用另一个firebase表中的外键查询,连接或过滤

时间:2017-03-10 12:22:59

标签: firebase firebase-realtime-database firebase-storage angularfire2

我有这个firebase数据结构

{
  members: {
    m1: {
     lastName: "smith",
     firstName: "john"
    },
    m2: {
     lastName: "abc",
     firstName: "mike"
    }
  },
  userFavs: {
    u1: {
       m1:true
    },
    u2: {
       m2:true
    }
  }
}

在我的服务中,我有这个方法:

  getMembers(): FirebaseListObservable<any[]> {
    return this.af.database.list('/members',{
      query: {
        orderByChild: 'firstName'
      }
    });
  }

在会员页面TS文件中,我有搜索方法:

  setFilteredItems(){
    if (this.searchTerm == null || this.searchTerm == ''){
      this.members = this.membersSvc.getMembers()
        .map((members) => {return members});
    }else{
      //return items.filter(item => item.name.toLowerCase().indexOf(args[0].toLowerCase()) !== -1);
      this.members = this.membersSvc.getMembers()
        .map((members) =>
          members.filter(member => member.lastName.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1 || member.firstName.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1));
    }
  }

搜索成员工作正常。现在我在搜索栏下方添加了2个按钮,全部收藏夹。用户可以在他/她的收藏夹中添加成员。在搜索中,应用程序需要能够使用用户收藏夹中存在的成员密钥过滤结果。

如何添加userFavs节点中存在的成员密钥的附加过滤器?

1 个答案:

答案 0 :(得分:0)

我通过获取userFavs键数组添加了额外的过滤器。所以在我的用户服务中我有一个方法:

  getUserFavKeys(){
    let favKeys = [];
    const userKey = this.authService.getActiveUser().uid;
    let url = `/userCircles/${userKey}`;
    this.af.database.list(url, { preserveSnapshot: true})
      .subscribe(itemKeys=>{
        itemKeys.forEach(itemKey => {
          //console.log(itemKey.key);
          favKeys.push(itemKey.key);
        });
      })
    return favKeys;
  }

然后在组件ngOnInit方法中,我初始化了键数组:

this.favKeys = this.userSvc.getUserFavKeys();

当圈子被选中时:

onCirclesSelected(){
    this.searching = false;
    this.members = this.membersSvc.getMembers()
        .map((members) =>
            members.filter(member => this.userCircles.indexOf(member.$key) !== -1)
        );

    if (this.searchTerm == null || this.searchTerm == ''){
            //do nothing
    }else{
        //filter w the search text
        this.members = this.members
            .map((members) =>
                members.filter(member => member.lastName.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1 || member.firstName.toLowerCase().indexOf(this.searchTerm.toLowerCase()) !== -1));
    }
}

希望对需要相同搜索功能的任何人有所帮助。