目前正在研究https://github.com/codediodeio/angular-firestarter此回购身份验证。
此代码段将用户名和电子邮件写入实时数据库,在此存储库的身份验证服务中,作者每次用户注册并登录时都使用此方法更新用户数据。
//// Helpers ////
private updateUserData(): void {
// Writes user name and email to realtime db
// useful if your app displays information about users or for admin features
const path = `users/${this.currentUserId}`; // Endpoint on firebase
const data = {
email: this.authState.email,
name: this.authState.displayName
}
this.db.object(path).update(data)
.catch(error => console.log(error));
}
在我目前正在处理的项目中,我使用上面的代码片段向firebase写入用户详细信息,用户详细信息(不仅仅是电子邮件和密码)只是在注册时不同于他使用该代码片段还要更新的repo登录和注册时的用户详细信息。
在
行中this.db.object(path).update(data)
我的文档https://github.com/angular/angularfire2/blob/master/docs/2-retrieving-data-as-objects.md#api-summary有两种方法,例如.update()
和set()
,它在文档中说.update()
非破坏性更新< / strong>和set()
破坏性更新。我尝试了这两个,它和另一个一样,
我的问题是,正如我上面所解释的那样,我只在注册时使用了代码段,我应该使用set()
或update()
?什么是破坏性和非破坏性更新,链接解释了这些大帮助。
答案 0 :(得分:2)
我注意到所有框架/工具对这两个动作使用相同的逻辑。因此set()
销毁对象并分配新值,而update()
仅更新已定义的属性。
所以,假设你在db中有对象:
car
color: "red",
engine: "v6"
当您运行类似car.set(color = "blue")
的内容时,对象变为:
car
color: "blue",
engine: undefined
做update(color = "blue")
给出:
car
color: "blue",
engine: "v6"
这解释了为什么你不能在原语上使用update()
- 它们只有一个属性,所以它无论如何都会被重置。