我使用angularfirebase创建了一个带有firestore的angular 8应用程序。
该应用程序应该可以离线工作,这可以通过在Firebase上启用持久性来正常工作。(并为角度创建一个服务工作者等(。
现在我像这样从火堆获取数据
public async get(): Promise<Customer[]> {
return await this.itemsCollection.valueChanges({ idField: 'id' }).pipe(take(1)).toPromise();
}
我不喜欢使用异步管道方法的可观察量,因为它使一切都变得过于复杂。
我现在遇到的问题是,如果我在 firestore 本身或其他设备上更新某些数据,本地数据不会更新。刷新页面后,它会继续获取旧的缓存火库数据。 我试图通过清除持久性缓存来解决此问题,但我不知道将其放在代码中的哪个位置以使其工作。
private db: AngularFirestore, // in constructor
this.db.firestore.clearPersistence(); // somewhere after initializing firebase
我也认为这不是一个好的生产就绪解决方案。
如何解决这个问题?
也许我应该去观察对象并重写所有内容。
我认为这里的valueChanges
可能不是正确的方法。既然您不需要实时更新,为什么不在每个页面重新加载时使用简单的get
呢?
火力基地 来源:https://firebase.google.com/docs/firestore/query-data/get-data#get_a_document
get
调用将返回Promise
因此无需转换它。仅当您的应用程序处于脱机状态时,persistence
才应该是一个问题。仅建议将清除持久性用于测试目的,因此在生产中避免清除持久性是正确的。
angularfire的例子,其中.get((返回一个可观察量:
public async get(): Promise<Customer[]> {
return await this.itemsCollection.get().pipe(map(
items => items.docs.map(doc => doc.data() as Customer)
)).toPromise();
}