AngularFire2如何使用自定义密钥而不是自动生成的密钥

8

目前我正在使用:

this.af.database.list('users').push(user);

如何使提交的对象的键是自定义的。 因此,我希望能够将此对象的节点设置为已注册用户的相同uid。 我可以访问此ID,我只需要知道如何使自定义用户对象节点不是在推送时自动生成的ID。
谢谢
8个回答

10

使用类似下面的方法与Angularfire2一起使用

addCustomKey (key, value) {
    const toSend = this.af.database.object(`/users/${key}`);
    toSend.set(value);
}

截至我的评论日期,由于/${key},这种方法会出错。我用一个变量替换了它,但是这会将我的自定义键作为值添加到节点中。 - Preston
这是Firestore还是实时数据库? - Omar

5
这是另一种你可以在AngularFire2中使用的方法。
addCustomKey(key, value) {
    const users = this.af.database.object('/users');
    users.update({ [key]: value });
}

2
正如上面许多答案所提到的,调用push()会为您生成一个键。这里有一种替代方法。

相反地,如果您想要设置自定义键来确定自己的键/路径,则必须使用child()。像这样:

firebase.database.ref().child('/path/with/custom/key/goes/here').set();

在您的情况下,要使用用户的身份验证ID,请按如下方式进行:

export class SomeClass {

    uid: string;

    constructor(public afDB: AngularFireDatabase, public afAuth: AngularFireAuth) {

          // Get User Auth ID
          afAuth.authState.subscribe(user => {
            this.uid = user.uid;
          });
      }

    //Your method
    this.afDB.database.ref().child(`users/${this.uid}/`).set(user);
}

2

push 命令会添加一个 push key,只需使用 update 方法:

this.yourRef = this.af.database.list('users');
let userId = "UID", 
userInfos = { data: "your user datas" };

this.yourRef.update(userId, userInfos);

不确定如何更新尚未具备键的内容。截至目前为止,此操作会失败并显示以下错误:第一个参数必须是包含要替换的子元素的对象。 - Preston

1

传入您的自定义密钥,例如projectKey,在这种情况下,projectKey是您从某个地方填充的变量:

private whatEverName(projectKey) {
    this.projectKey = projectKey;
    this.af.object('/Projects/' + this.projectKey);
}

在代码中的任何位置调用whatEverName(projectKey),即可获得自定义节点键。此建议截至2017年7月25日仍然有效。
我在此添加了更多内容,以帮助那些试图创建一个子节点,并使用另一个推送键作为自定义键的人。这对于该项目下的关联索引非常有用,例如正在该项目上工作的用户列表。您可能不想在项目数据中列出此列表,而是通过查询获得它。这使得数据去规范化变得更加容易,从而实现Firebase的目标。
在本例中,该关联节点称为ProjectsMembers,我们在其中记录了项目的所有者。以同样的方式添加其他用户节点。请注意反单引号!!!单引号无法正常工作。在这种情况下,我将所有者名称设置为推送键的参考。在数据库中更易于阅读。
// Add child node with project key as push key to the association index.
this.af.object(`ProjectsMembers/${projectKey}/` + this.ownerKey)
   .set({ ownerName: this.ownerName });

1
"vanilla js 程序大致如下:"
//to generate a key do something like
var id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
  var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
  return v.toString(16);
});

function setNode(key){
  if (key){
    var thisRef = ref.child('testLocation');
    var obj = {};
    obj[key] = true;
    thisRef.update(obj, onComplete);
  }
}

0

我建议这是最简单的方法。

import { Component, OnInit } from '@angular/core';
import { AngularFireDatabase } from '@angular/fire/database';

@Component({
  selector: 'app-mycomponent',
  templateUrl: './mycomponent.page.html',
  styleUrls: ['./mycomponent.page.scss'],
})
export class MyComponent implements OnInit {

  constructor(
    private db: AngularFireDatabase
  ) { }

  ngOnInit() {}

  submit(user) {
    this.db.database.ref('users').child('your_custom_key').set(user)
  }
}


你能解释一下你改了什么以及它是如何工作的吗? - Elikill58

0

只需使用常规的Firebase方法即可完成,如下所示:

var updates = {};
  updates['/users/' + userId] = newUserData;

return firebase.database().ref().update(updates);

你作用域中与列表绑定的任何内容都将反映更新。

在Web上读写数据


1
.ref 似乎已经过时,截至2017年7月。 - Preston
你能具体一点吗? - ksav
ksav - 我看到.ref已经被弃用了,但是没有找到相关的来源。请查看文档并在网上搜索。 - Preston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接