【问题标题】:AngularFire2 query, join or filter with foreign keys from another firebase tableAngularFire2 使用另一个 firebase 表中的外键查询、连接或过滤
【发布时间】:2017-07-31 19:06:53
【问题描述】:

我有这个 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 个按钮,AllFavorites。用户可以在他/她的收藏夹中添加成员。在搜索中,应用程序需要能够使用用户收藏夹中存在的成员键过滤结果。

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

【问题讨论】:

  • 您似乎没有在这里提出问题或出现错误。
  • @Kato 谢谢!我用问题更新了它。

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


【解决方案1】:

我通过获取 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方法中,我初始化了keys数组:

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

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

【讨论】:

  • 让 url = /userCircles/${userKey};这是否必须绑定到函数
  • 你能详细说明你的问题吗?谢谢
  • 那个 userKey 是一个动态值,对吧?这就是你如何在 PATHS 之间进行更改,我正在努力找出拥有动态路径的最佳方式。
  • 是的。再次查看该代码,我可以写成let url = `/userCircles/${this.authService.getActiveUser().uid}`; 来避免const userKey 声明。
  • 我在离线库中尝试过,但一直失败。它不会接受它,你有没有使用过那个包装器?
猜你喜欢
  • 1970-01-01
  • 2013-09-22
  • 2018-06-18
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多