angularfire2:破坏性更新(set())和非破坏性更新(update())之间的区别

时间:2017-09-27 15:12:06

标签: angular firebase angularfire2

目前正在研究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()?什么是破坏性非破坏性更新,链接解释了这些大帮助。

1 个答案:

答案 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() - 它们只有一个属性,所以它无论如何都会被重置。