代码之家  ›  专栏  ›  技术社区  ›  Emanuela Colta

获取uid并使用Angular4和Fireabse迭代对象数组

  •  2
  • Emanuela Colta  · 技术社区  · 9 年前

    我正在使用Angular4和Firebase建立一个1-1聊天,我对Angular很陌生。 为了启动对话,我试图从“/用户”子集合中显示所有可用的用户。所以,我需要获取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" />
    

    如何迭代从“/用户”集合中获得的对象数组?谢谢!:)

    2 回复  |  直到 9 年前
        1
  •  2
  •   CharanRoot    9 年前

    你需要使用 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([]);
                });
    

    https://www.learnrxjs.io/operators/combination/forkjoin.html

        2
  •  1
  •   Hans Anker    9 年前

    private getPlayersPerGroup(group: Group) {
        this.playersInGroup = [];
        if (group["players"]) {
            Object.keys(group["players"]).forEach((key) => {
                this.groupService.getPlayerById(key).then((player) => {
                    this.playersInGroup.push(player);
                });
            });
        }
    }