Firebase AngularFire2-加入成员和用户

Firebase AngularFire2-加入成员和用户,firebase,firebase-realtime-database,angularfire2,Firebase,Firebase Realtime Database,Angularfire2,我试图在AngularFire2应用程序中列出用户对话,其结构如下: 聊天 使用者 我正在尝试映射和列出聊天,这样我就可以很容易地显示聊天参与者的姓名,并在最后一条消息下面大声吼叫 问题1:此示例与当时的官方推荐略有不同,但我觉得它仍然有效且可扩展。我说得对吗 问题2:如何实际加入成员和用户,在我的聊天列表中拥有用户数组 这是我到目前为止所拥有的 // retrieve chats "user1" participates in this.afChatsRef = this.af.databas

我试图在AngularFire2应用程序中列出用户对话,其结构如下:

聊天

使用者

我正在尝试映射和列出聊天,这样我就可以很容易地显示聊天参与者的姓名,并在最后一条消息下面大声吼叫

问题1:此示例与当时的官方推荐略有不同,但我觉得它仍然有效且可扩展。我说得对吗

问题2:如何实际加入成员和用户,在我的聊天列表中拥有
用户
数组

这是我到目前为止所拥有的

// retrieve chats "user1" participates in
this.afChatsRef = this.af.database.list(this.datastore(), {
  query: {
    orderByChild: "/members/user1", // by user id in members
    equalTo: true,
  }
}).map(chats => {
   chats.map(chat => {
        // HMMM? WHAT TO DO HERE ?
   });
   return chats;
});
提前谢谢

更新我还尝试了以下方法,但似乎不太正确(而且我无法访问用户属性)


您希望返回嵌套映射并获取其中的用户。像这样的东西

// retrieve chats "user1" participates in
this.afChatsRef = this.af.database.list(...).map(chats => {
   // Note the return!
   return chats.map(chat => {
        // Avoid side effects by storing members separate from the keys
        chat.memberData = {};
        // Iterate keys and download members
        Object.keys(chat.members||{}).forEach(uid => {
            // `users` represents a service to cache and load users on demand
            chat.memberData[uid] = users.load(uid);
        });
   });
   return chats;
});
下面是一个使用缓存创建用户服务的好方法:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Rx';
import { AngularFireDatabase } from 'angularfire2/database';

@Injectable()
export class UserProvider {
  db: AngularFireDatabase;
  users: Map<String, Observable<User>>;

  constructor(db: AngularFireDatabase) {
    this.db = db;
    this.users = new Map();
  }

  load(userid:string) : Observable<User> {
    if( !this.users.has(userid) ) {
      this.users.set(userid, this.db.object(`members/${userid}`).valueChanges());
    }
    return this.users.get(userid);
  }
}

export interface User {
  name:string;
  nick:string;
}
从'@angular/core'导入{Injectable};
从'rxjs/Rx'导入{Observable};
从“angularfire2/database”导入{AngularFireDatabase};
@可注射()
导出类用户提供程序{
db:AngularFire数据库;
用户:地图;
构造函数(db:AngularFireDatabase){
这个.db=db;
this.users=newmap();
}
加载(userid:string):可观察{
如果(!this.users.has(userid)){
this.users.set(userid,this.db.object(`members/${userid}`).valueChanges());
}
返回this.users.get(userid);
}
}
导出接口用户{
名称:字符串;
尼克:绳子;
}
这里是AngularFire2中异步连接的一个示例

 this.af.database.list(this.datastore()).map(chats => {

            chats.map(chat => {
                // chat.users = [];

                for (var key in chat.members) {
                    this.af.database.object("/users/" + key).subscribe(user => {
                        chat.members[key] = user;
                    });
                }

                return chat;
            });

            console.log(chats);
            return chats;
        });
// retrieve chats "user1" participates in
this.afChatsRef = this.af.database.list(...).map(chats => {
   // Note the return!
   return chats.map(chat => {
        // Avoid side effects by storing members separate from the keys
        chat.memberData = {};
        // Iterate keys and download members
        Object.keys(chat.members||{}).forEach(uid => {
            // `users` represents a service to cache and load users on demand
            chat.memberData[uid] = users.load(uid);
        });
   });
   return chats;
});
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Rx';
import { AngularFireDatabase } from 'angularfire2/database';

@Injectable()
export class UserProvider {
  db: AngularFireDatabase;
  users: Map<String, Observable<User>>;

  constructor(db: AngularFireDatabase) {
    this.db = db;
    this.users = new Map();
  }

  load(userid:string) : Observable<User> {
    if( !this.users.has(userid) ) {
      this.users.set(userid, this.db.object(`members/${userid}`).valueChanges());
    }
    return this.users.get(userid);
  }
}

export interface User {
  name:string;
  nick:string;
}