众所周知,版本 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() }))
);
}
后者(有点)需要我通过一个关键属性来扩展我的 Booking 模型,我可以getKey
相应地调整我的方法。
但是现在尴尬的部分来了:更新预订将导致 Firebase 数据库中出现奇怪的数据结构,其中键以“list-key”和“list-object”的键属性形式出现。
推荐的方法是什么?我看到了两个选项,这两个选项都让我不太满意:
- 在更新之前从
Booking
实例中删除属性 - 不添加它的预订模型?然后我们有一个无类型的属性和“魔法”泄漏到服务之外的应用程序。