众所周知,版本5中对angularFire api进行了重大更改。例如,在我的数据服务中,我之前有过这样的方法:
getBookings(): Observable<Booking[]> {
return this.db.list('bookings');
}
update(booking: Booking): void {
this.db.object('bookings/' + this.getFireBaseKey(booking)).update(booking);
}
private getFireBaseKey(b: Booking): string {
return (<any>b).$key;
}
现在,在升级到angularFire5后,我遇到了以下问题:因为我希望所有与firebase相关的东西都封装在我的服务中,而不是泄漏到应用程序的其余部分,我想从服务中公开rxjs Observables。因此,我必须在valueChanges()
中添加对getBookings()
的调用 - 但随后我将$key
(我稍后需要更新)中的内容放宽,或者放到snapshotChanges()
我将其映射如下:
getBookings(): Observable<Booking[]> {
return this.db.list<Booking>('bookings')
.snapshotChanges()
.map(changes =>
changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
);
}
后者(有点)要求我通过关键属性扩展我的预订模型,并且我可以相应地调整我的getKey
方法。
但现在尴尬的部分来了:更新预订将导致Firebase数据库中出现奇怪的数据结构,其中密钥作为“list-key”出现,并作为“list-object”的关键属性。
推荐的方式是什么?我看到两个选项,对我来说都不是很令人满意:
Booking
实例中删除该属性