Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 将Typescript类型同步到Firebase对象可观察对象,而不丢失函数等_Angular_Typescript_Firebase_Firebase Realtime Database_Angularfire2 - Fatal编程技术网

Angular 将Typescript类型同步到Firebase对象可观察对象,而不丢失函数等

Angular 将Typescript类型同步到Firebase对象可观察对象,而不丢失函数等,angular,typescript,firebase,firebase-realtime-database,angularfire2,Angular,Typescript,Firebase,Firebase Realtime Database,Angularfire2,我正在使用Typescript开发Angular 2应用程序,我经常遇到这样的问题:当同步数据时,我似乎无法很容易地持久化对象类型 我一直在手动设置属性。在某些情况下,我只是删除$exists()、$key、createdat函数和属性,以便能够更新数据 有没有一种方法可以在不完全更改Firebase对象的情况下从Firebase对象设置类 例如: search$:FirebaseObjectObservable; 搜索:ISearchQuery; 构造函数(公共af:AngularFire,公

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

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

有没有一种方法可以在不完全更改Firebase对象的情况下从Firebase对象设置类

例如:

search$:FirebaseObjectObservable;
搜索:ISearchQuery;
构造函数(公共af:AngularFire,公共auth:AuthService){
this.search$=this.af.database.object(`/querys/saved/${auth.id}`);
//这就是我想做的
此.search$.subscribe((数据)=>{
if(数据$exists()){
搜索=数据;
}
});  
//这就是我所求助的
此.search$.subscribe((数据)=>{
if(数据$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对象在原型中有自己的函数集)


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

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

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

构造函数(公共af:AngularFire,公共auth:AuthService){
this.search$=this.af.database.object(`/querys/saved/${auth.id}`{
保存快照:true
});
此.search$.subscribe((快照)=>{
if(snapshot.exists()){
this.search=snapshot.val();
}
});
}
如果以后需要,可以随时保留快照

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

例如:

this.search$.subscribe((快照)=>{
if(snapshot.exists()){
//给定SomeSearchQuery实现ISearchQuery
this.search=newsomesearchquery(snapshot.val());
}
});

这太好了,而且就重新同步数据而言,这似乎是答案的一半,而不必去掉函数等等。。。然而,当我以我想要保留的方式实例化一个类时,看起来我仍然丢失了ISearchQuery类型上的函数。有办法吗?更新了答案。这让我省去了很多头痛。我可以直接同步对象,而无需删除$exists、$key等。。。这对于使用构造函数传递匿名对象是有意义的。万分感谢!