如何使用AngularFire2加入文档?

时间:2016-09-29 20:14:02

标签: firebase firebase-realtime-database angularfire2

我在Firebase中有另一个文档的ID列表,如下所示:

{
  uid,
  members: [0, 1, 3],
  ...
},

我目前正在加入成员对象:

af.database.list('/threads')
  .map((message) => {
     message.members = message.members.map((memberID) => {
       return af.database.object('/users/' + memberID);
     });
 });

有更清洁的方法吗?

1 个答案:

答案 0 :(得分:0)

一个想法是创建一个ThreadComponent,将成员ID传递给处理成员数据的子MemberComponent

<强> threads.component.html

<div class="thread" *ngFor="let thread of threads$ | async">
  <my-member *ngFor="let memberId of thread.members"
    [memberId]="memberId"></my-member>
</div>

<强> threads.component.ts

import { Component, OnInit } from '@angular/core';
import { AngularFire } from 'angularfire2';

@Component({
  selector: 'my-thread',
  templateUrl: 'thread.component.html',
  // ...
})
export class MyThreadComponent implements OnInit {
  threads$;

  constructor (private af: AngularFire) {}
  ngOnInit () {
    this.threads$ = this.af.database.list('/threads');
  }
}

<强> member.component.html

<div>{{ memberInfo$ | async }}</div>

<强> member.component.ts

import { Component, Input, OnInit } from '@angular/core';
import { AngularFire } from 'angularfire2';

@Component({
  selector: 'my-member',
  templateUrl: 'member.component.html',
  // ...
})
export class MyMemberComponent implements OnInit {
  @Input() memberId;
  memberInfo$;

  constructor (private af: AngularFire) {}
  ngOnInit () {
    this.memberInfo$ = this.af.database.list(`/users/${memberId}`);
  }
}

我能用当前方法看到的一个问题是,看起来你可能会在angularfire中改变返回的observable,这可能会导致不良影响。您可以创建一个不同的变量,并将返回的成员firebase observable设置为该变量。