1

众所周知,版本 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实例中删除属性
  • 不添加它的预订模型?然后我们有一个无类型的属性和“魔法”泄漏到服务之外的应用程序。
4

0 回答 0