将Typescript类型同步到Firebase对象Observable而不会丢失函数等

时间:2017-01-18 04:41:06

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

我正在开发一个带有Typescript的Angular 2应用程序,而且我经常遇到的问题是,在同步数据时,我似乎无法很容易地持久保存对象类型。

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

有没有办法在不完全更改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对象在原型中有自己的一组函数)。

有没有办法避免按属性选择属性或更好地处理使用Typescript同步Firebase对象?

1 个答案:

答案 0 :(得分:2)

听起来您希望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 - 我假设它是一个接口 - 您从snapshot.val()收到的值是一个匿名对象。将它强制转换为描述数据“形状”的接口是安全的,但如果该接口包含方法,那么它将不起作用,因为匿名对象上不存在这些方法。如果您有一个实现该接口的类,则应该包含一个构造函数,该构造函数接受您从snapshot.val()收到的匿名对象。

例如:

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