Угловая стойкость пожарной базы извлекает новые данные из пожарного депо - PullRequest
0 голосов
/ 26 сентября 2019

Я создал приложение angular 8 с firestore, используя angularfirebase.
Приложение должно работать в автономном режиме, это отлично работает, если включить сохранение на базе firebase.(И создайте сервис-работника и т. Д. Для angular).
Теперь я получаю свои данные из firestore следующим образом:

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

Я также думаю, что это не хорошее готовое решение.

Как я могу решить эту проблему?
Может, мне все-таки стоит заняться наблюдаемыми и переписать все.

1 Ответ

1 голос
/ 27 сентября 2019

Я думаю, что valueChanges здесь может быть неправильным подходом.Поскольку вам не нужны обновления в режиме реального времени, почему бы не пойти с простой get перезагрузкой каждой страницы?

источник firebase: https://firebase.google.com/docs/firestore/query-data/get-data#get_a_document

a 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();
  }
...