node.js - 使用 Angular 和 Firebase 获取 uid 并迭代对象数组

标签 node.js angular firebase chat angularfire

我正在使用 Angular4 和 Firebase 构建 1-1 聊天,而且我对 Angular 还很陌生。 为了发起对话,我尝试显示“/users”子集合中的所有可用用户。所以,我需要获取 user/{user.uid}/username。

这是我的 chat.component.ts:

import { Component, OnInit } from '@angular/core';
import {AngularFireDatabase, FirebaseListObservable} from 'angularfire2/database';
import { AngularFireAuth } from 'angularfire2/auth';
import { UserSessionService } from '../_services/user-session.service';

@Component({
  selector: 'app-chat',
  templateUrl: './chat.component.html',
  styleUrls: ['./chat.component.css']
})
export class ChatComponent implements OnInit {
  items: FirebaseListObservable<any[]>;
  other_users: FirebaseListObservable<any[]>;
  user_id: any;
  from: any;
  msgVal: string = '';


  constructor(public afAuth: AngularFireAuth, public af: AngularFireDatabase, public logged_user: UserSessionService ){ }

    ngOnInit() {

      this.from= this.logged_user.getFirebaseUid();
      this.user_id= this.logged_user.getFirebaseUid();

      this.items = this.af.list('/personalMessages', {
      query: { limitToLast: 5  }
    });

    this.other_users= this.af.list('/users');

  }

  findChat(){
    this.other_users= this.other_users;
     this.user_id = this.user_id;    
  }

    chatSend(theirMessage: string) {     
      this.items.push({ text: theirMessage, from: this.logged_user.getFirebaseUid(), isRead: false, timestamp: + new Date()  });
      this.msgVal = '';
      this.user_id = this.user_id;
      this.other_users= this.other_users;
  }

}

这是我的 chat.component.html:

<div class="users-chat-container" *ngFor="let other_user of other_users| async">
      <div id="circle" style="background-color:pink;">        
      </div>
     <br/> <a href="#">{{other_user.username}}  </a>    

    </div>


    <div class="chat-container" *ngFor="let item of items | async">
      <div id="circle" style="background-image:url( http://www.ics.forth.gr/mobile/female.png);">        
      </div>
     <br/> <a href="#">{{item.from}}  </a>    
      <p>{{item.text}}</p>
    </div>
     <input type="text" id="message" placeholder="Type a message..." (keyup.enter)="chatSend($event.target.value)" [(ngModel)]="msgVal" />

如何迭代从“/users”集合中获取的对象数组?谢谢你! :)

最佳答案

您需要使用ForkJoin。 ForkJoin 会将用户列表作为输入,并对所有用户列表触发并行请求

尝试这样的事情

this.af.list('/users')
            .mergeMap((users) => {
               if (users.length > 0) {

                return Observable.forkJoin(
                    users.map((user) => this.af.database
                        .object(`user/${user.$uid}/username`)
                        .first()
                    ),

                    (...values) => { // here you can assign username 
                        users.forEach((user, index) => { user.username = values[index]; });
                        return users;
                    }
                  );
          }
          return Observable.of([]);
            });

有关 forkJoin 的更多信息 https://www.learnrxjs.io/operators/combination/forkjoin.html

关于node.js - 使用 Angular 和 Firebase 获取 uid 并迭代对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038085/

相关文章:

node.js - heroku 应用程序重命名中缺少步骤

node.js - 使用axios上传图片的问题

javascript - Google Sheet API,PUT : this. http.put(...).map 不是函数

angular - 为什么我没有得到任何数据? Ngrx

java - 如何修复我的 Arraylist 并将其设置在我的 ListView 中

node.js - Node Sequelize (MSSQL) - 用户 '' 登录失败

node.js - 在 nodejs 中使用 Html 文件作为模板发送带有一些复杂级别数据的营销电子邮件

angular - 如何重命名 Angular 应用程序?

firebase - 具有一个 Firebase 身份验证的多个 Firebase 数据库

android - Firebase 动态链接生成器中的 DFL 参数