Angularfire2更新记录

时间:2018-05-08 03:24:40

标签: angular firebase firebase-realtime-database angular5 angularfire2

我对角度很新,我正在建立一个小型网络应用程序。

我已设法设置angularfire 2并成功设法使用Push()创建新的列表条目。

假设我的列表(用户)包含用户电子邮件和名字。只有通过Push方法添加电子邮件,我想通过添加名字来更新该记录。

我提到了Angularfire2文档,并设法做到这一点:

 usrEmail: string;
 usrData: AngularFireList<any>;
 usr: Observable<any>;


  constructor( private authService: AuthService, private afd: AngularFireDatabase) {


    this.usrData = this.afd.list('/users')
    // now get the current user
    this.usr = this.usrData.snapshotChanges().map(changes => {
      return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
     });

  }

我不确定如何通过 usrEmail 过滤列表并获取更新记录的密钥。

非常感谢任何帮助我指向正确方向的帮助。

1 个答案:

答案 0 :(得分:0)

您使用的查询获得的所有/users不仅仅是具有匹配电子邮件地址的单个用户。

我假设您有权访问该电子邮件地址,并将其分配给变量userEmailAddress

this.usr = this.afd.list('/users', ref => ref
  .orderByChild('usrEmail')
  .equalTo(userEmailAddress)
)
.snapshotChanges()
.map(changes => {
  return changes.map(c => ({ key: c.payload.key, ...c.payload.val() }));
})
.first()
.subscribe(snapshots => {
  snapshots.forEach(snapshot => {
    console.log('Snapshot Key: ', snapshot.key);
    console.log('Snapshot Payload: ', snapshot.val());
  });
});

snapshot.key的输出将是您尝试获取的密钥。

但是在您的方案中,有一种更好的方式来存储客户的电子邮件地址。您可以在数据库中创建包含user-id的路径,例如;

我假设您可以通过authService访问uid。 this.authService.uid

this.afd.object(`/users/${this.authService.uid}`).update({
  email: userEmailAddress
});

用户的uid永远不会改变,并且对于该用户来说是唯一的,因此您可以使用它创建数据库路径以便于访问。