AngularFire2 - 嵌套的FirebaseObjectObservable不会触发嵌套的Firebase调用 [英] AngularFire2 - nested FirebaseObjectObservable won't fire a nested Firebase call

查看:187
本文介绍了AngularFire2 - 嵌套的FirebaseObjectObservable不会触发嵌套的Firebase调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



问题是嵌套的observable从我所知道的情况来看,它们从来没有被召唤过。我几个小时没有取得任何真正的成功,一直在殴打我的头。任何人都可以告诉我做错了什么?我感觉这是一个很常见的问题,得到解决。

  public getUserProfile(data){

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

//一旦代码到达这一行,就不会触发:(
this._af.database.object(`/ social / videos / $ {vidKey}`).map((video )=> {
user.videos [vidKey] = video;
});
}
返回用户;
});
}


解决方案

嵌套的observable永远不会被调用,因为它永远不会被订阅 - 你可以做这样的事情,而不是:

  public getUserProfile(data){

return this._af.database
.object(`/ social / users / $ {data.id}`)

//切换到加入可观察的

.switchMap((user)=> {

let vidKeys = Object.keys(user.videos);

//使用forkJoin加入视频观察对象。可观察到的
//需要完成,所以首先使用。并使用forkJoin的选择器
//将视频映射到用户,然后返回用户。
$ b $ return Observable.forkJoin(
vidKeys.map((vidKey)=> this._af.database
.object(`/ social / videos / $ {vidKey}` )
.first()
),
(... videos)=> {
vidKeys.forEach((vidKey,index)=> {user.videos [ vidKey] = videos [index]});
返回用户;
}
);
});
}


I've got a question about dealing with working with many-to-many relationships in Firebase. Basically, I'm trying to build a user profile object from multiple paths inside of my Firebase data. I've tried building a function that returns an observable and then updates the data in that observable as a nested observable grabs data from Firebase.

The problem is that the nested observable doesn't ever get called, from what I can tell. I've been beating my head against this for hours without any real success. Can anyone tell what I'm doing wrong? I feel this is a pretty common problem that gets solved.

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

解决方案

The nested observable is never called because it's never subscribed to - observables are lazy.

You could do something like this, instead:

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

这篇关于AngularFire2 - 嵌套的FirebaseObjectObservable不会触发嵌套的Firebase调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆