【问题标题】:AngularFire2 - nested FirebaseObjectObservable won't fire a nested Firebase callAngularFire2 - 嵌套的 FirebaseObjectObservable 不会触发嵌套的 Firebase 调用
【发布时间】:2017-03-28 14:48:19
【问题描述】:

我有一个关于在 Firebase 中处理多对多关系的问题。基本上,我正在尝试从我的 Firebase 数据中的多个路径构建一个用户配置文件对象。我尝试构建一个函数,该函数返回一个 observable,然后更新该 observable 中的数据,因为嵌套的 observable 从 Firebase 抓取数据。

据我所知,问题是嵌套的 observable 永远不会被调用。几个小时以来,我一直在为此努力,但没有任何真正的成功。谁能告诉我做错了什么?我觉得这是一个很常见的问题,可以得到解决。

public getUserProfile(data) {

    return this._af.database.object(`/social/users/${data.id}`).map((user) => {
        for ( let vidKey in user.videos) {

            // Once the code hits this line, it never fires at all :(
            this._af.database.object(`/social/videos/${vidKey}`).map((video) => {
                user.videos[vidKey] = video;
            });
        }
        return user;
    });
}

【问题讨论】:

    标签: angular firebase firebase-realtime-database ionic2 angularfire2


    【解决方案1】:

    嵌套的可观察对象永远不会被调用,因为它永远不会被订阅 - 可观察对象是惰性的。

    您可以这样做:

    public getUserProfile(data) {
    
      return this._af.database
        .object(`/social/users/${data.id}`)
    
        // Switch to the joined observable
    
        .switchMap((user) => {
    
          let vidKeys = Object.keys(user.videos);
    
          // Use forkJoin to join the video observables. The observables will
          // need to complete, so first is used. And use forkJoin's selector to
          // map the videos to the user and then return the user.
    
          return Observable.forkJoin(
            vidKeys.map((vidKey) => this._af.database
              .object(`/social/videos/${vidKey}`)
              .first()
            ),
            (...videos) => {
              vidKeys.forEach((vidKey, index) => { user.videos[vidKey] = videos[index] });
              return user;
            }
          );
        });
    }
    

    【讨论】:

    • cartant,你绝对是最棒的。我已经意识到这是我将在很多不同的“加入式”事情上重用这种功能的情况之一。这很完美,它实际上展示了一种简洁的方法:)干杯!
    • 实际上,我很好奇:如果我希望我的 UI 在其他地方发生变化时自动更新视频详细信息,我是否需要重新设计它以使用 Firebase 数据库中每个单独视频的订阅?在您当前的版本中,视频数据仅加载一次,但如果在数据库中更新,则不会更新。我的想法是,我想使用相同的功能来聚合用户之间的消息或不同帖子的提要。
    • 是的,您需要更改它。答案中的代码仅在用户更改时才会重新发出。如果您想在发生任何变化时重新发出,您可以使用combineLatest 而不是forkJoin。并删除 first 运算符。
    • 太棒了 :) 我确实尝试过,我注意到,是的,当我更改用户或视频上的任何内容时,对象会更新......但只有一次。任何时候我在初始更改后进行更改,它们都不会反映在 UI 中。你知道是什么原因造成的吗?
    • 从传递给 combineLatest 的 observables 中删除 first 运算符。
    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2017-06-04
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多