angular - 将 Typescript 类型同步到 Firebase Object Observables 而不会丢失功能等

标签 angular typescript firebase firebase-realtime-database angularfire2

我正在使用 Typescript 开发 Angular 2 应用程序,我经常遇到这样一个问题,即在同步数据时我似乎无法很容易地持久化对象类型。

我一直在手动设置属性。在某些情况下,我只是删除 $exists()、$key、c​​reatedat 函数和属性以便能够更新数据。

有没有办法从 Firebase 对象设置一个类而不完全改变它?

举个例子:

search$:FirebaseObjectObservable<ISearchQuery>;
search:ISearchQuery;

constructor(public af: AngularFire, public auth: AuthService){
  this.search$ = this.af.database.object(`/queries/saved/${auth.id}`);
  //THIS IS HOW I WANT TO DO IT
  this.search$.subscribe((data)=>{
    if(data.$exists()){
       this.search=data;           
    }
  });  

  //THIS IS WHAT I'VE RESORTED TO
  this.search$.subscribe((data)=>{
    if(data.$exists()){
      this.search.categories = data.categories;
      this.search.creators = data.creators;
      this.search.endDate = data.endDate;
      this.search.startDate = data.startDate;
      this.search.location = data.location;
     }
  });  
}

另一方面,当我同步和更新数据后,我必须在更新或设置为 firebase 时选择每个属性。如果我直接同步,我也会遇到问题,我也会丢失类函数(因为 firebase 对象在原型(prototype)中有自己的一组函数)。

有没有一种方法可以避免逐个属性地选择属性,或者有更好的方法来处理 Firebase 对象与 Typescript 的同步?

最佳答案

听起来您希望 AngularFire2 保留 Firebase 快照。默认情况下,它 'unwraps' the snapshots ,添加您不需要的 $ 前缀属性和函数。

如果您指定 preserveSnapshot选项,它不会执行此操作,您可以调用 snapshot.val():

constructor(public af: AngularFire, public auth: AuthService) {

  this.search$ = this.af.database.object(`/queries/saved/${auth.id}`, {
    preserveSnapshot: true
  });
  this.search$.subscribe((snapshot) => {
    if(snapshot.exists()) {
       this.search = snapshot.val();
    }
  });
}

如果您以后需要它,您可以随时保留快照。

关于 ISearchQuery - 我假设它是一个接口(interface) - 您从 snapshot.val() 收到的值是一个匿名对象。将其转换为描述数据“形状”的接口(interface)是安全的,但如果该接口(interface)包含方法,它将无法工作,因为这些方法将不存在于匿名对象上。如果您有一个实现该接口(interface)的类,您应该包含一个构造函数,该构造函数接受您从 snapshot.val() 接收的匿名对象。

例如:

this.search$.subscribe((snapshot) => {
  if(snapshot.exists()) {
    // Given SomeSearchQuery implements ISearchQuery
     this.search = new SomeSearchQuery(snapshot.val());
  }
});

关于angular - 将 Typescript 类型同步到 Firebase Object Observables 而不会丢失功能等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41711471/

相关文章:

firebase - E/FirebaseInstanceId( 5789) : Topic sync or token retrieval failed on hard failure exceptions: AUTHENTICATION_FAILED. 不会重试操作

javascript - Firebase 安全问题——如何让一个用户更改另一个用户的数据库对象?

Angular Material 对话框返回值

javascript - 使用 NGRX 存储测试异步 Angular 验证器

TypeScript 类泛型约束

javascript - 如何实现 es5 样式 "class"的 Typescript 接口(interface)?

javascript - 如何将polyfills和外部库与Rollup JS捆绑在一起?

angular - ngrx - 有条件地停止/删除效果/ Action

javascript - 如何使用 TypeScript 对象中的字段作为另一个字段的值?

javascript - 如何将从 useEffect 中获取的初始值放入文本字​​段中?