【问题标题】:AngularFire2 and Firestore dyanamic query: based on the user preferencesAngularFire2 和 Firestore 动态查询:基于用户偏好
【发布时间】:2018-09-20 01:42:53
【问题描述】:

这就是我想要实现的目标。

我的用户添加了最喜欢的俱乐部(如利物浦、巴萨等)。最喜欢的俱乐部的数量可以从 1 到 5(最多 5 个)不等。

当我需要显示最喜欢的俱乐部新闻时,我需要从 Firestore 中获取所有新闻,其中俱乐部名称添加为文档的属性...

news: sddf938slsjsf(ID): title: 'news title', club: 'Liverpool'

如果我知道数量固定的俱乐部数量,我可以拥有 - 基于每个 fav_clubs (.where('club', '==','Liverpool') 的五个可观察流并使用 CombineLatest 运算符.

但在我的情况下,最喜欢的俱乐部的数量可能会有所不同,这些数量是从用户收藏中获取的 -> Tagged_clubs。

我正在努力寻找实现这一目标的方法。

【问题讨论】:

    标签: angular firebase google-cloud-firestore angularfire2


    【解决方案1】:

    这是您的最低要求模型(我不会限制为 5 支球杆才能更快):

    User {
      ID: string;
      favorites: string[];
    }
    
    Club {
      ID: string;
    }
    
    New {
      club: string;
      title: string;
      content: string;
    }
    

    现在,假设您想获取用户最喜欢的俱乐部的所有新闻。

    getFavNews(user: User) {
      const calls = [];
      for (let fav of user.favorites) {
        calls.push(this.getNewForClub(fav));
      }
      return forkJoin(calls);
    }
    
    getNewForClub(club_ID: string) {
      // Firebase request to get the news about the given club
    }
    

    使用此代码,您将需要订阅该方法,该方法将为俱乐部返回一组新闻:forkJoin 允许您一次触发多个请求,并且只有在所有请求都已完成时才会执行您的订阅被制作。

    这就是我会做的。

    【讨论】:

    • 非常感谢。我会尝试这个解决方案并更新这篇文章。
    • 谢谢它的工作。但是在使用 firestore 查询时有一点很重要 - valueChanges() 或 snapShopChanges() 不会完成。必须完成 Observable 才能使用 forkJoin。我正在使用 take(1) 运算符来完成 observable。
    • 如果你能解释一下,再问一个问题:在 forkjoin 之后,结果是一个数组数组 [ { }[ ], { }[ ] ] ,我想将所有这些项目合并为一个单身的。我不知道该怎么做:( :(
    • 我也使用take 运算符来取消我的请求。你想在你的情况下保持实时吗?
    • 关于您的第二期,您可以使用forkJoin(calls).map(arrays: Array<any[]> => [].concat.apply([], arrays))。这会将所有数组连接成一个。
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2023-04-01
    • 2018-10-25
    • 2014-05-21
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多