Исключение для firebase.firestore.Timestamp toDate () - PullRequest
0 голосов
/ 27 февраля 2020

Я получаю исключение, когда пытаюсь получить доступ к файлу firebase.firestore.Timestamp (trialEnds) для документа, используя:

   <ng-container *ngIf="account$ | async as account;">
   // Listing out other account info works fine here...
   // Then an exception on trialEnds access
   <span *ngIf="account.trialEnds != null">
      {{account.trialEnds.toDate() |  date: 'M/d/yyyy'}})
   </span>

Полученное исключение выглядит так:

core. js: 3828 ОШИБКА TypeError: account_r9062.trialEnds.toDate не является функцией в HeaderComponent_ng_container_14_ng_container_1_span_5_Template (header.component. html: 38) в executeTemplate (ядро. * 1023) 7: обновление (ядро. * 1023) 7 js: 7362) в refreshDynamicEmbeddedViews (ядро. js: 8428) в refreshView (ядро. js: 7382) в refreshDynamicEmbeddedViews (ядро. js: 8428) в refreshView (ядро. js: 7382) в refreshDynamicEmbeddedViews (core. js: 8428) в refreshView (core. js: 7382) в refreshComponent (core. js: 8492)

Вот как я настраиваю данные в моем компоненте:

   var trialDays = 14
   var trialEndDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() + trialDays)
   var trialEnds = firebase.firestore.Timestamp.fromDate(trialEndDate)
   var account: Account = {
   ...
      trialEnds: trialEnds
   }

Данные хорошо отображаются в консоли Firestore, но странная часть заключается в том, что если я обновлю их в консоли БЕЗ изменения данных вообще, я смогу прочитать их просто отлично. Буквально нет разницы между установленным в программе значением и обновленным вручную значением в документе:

enter image description here

Он также вызывает исключение для других вызовов, таких как toMillis также. Что происходит?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Я нашел обходной путь. Вместо вызова toDate для временной метки я создаю свою собственную переменную, привязанную к наблюдаемой:

   ngOnInit() {
      try {
         this.account$.subscribe(account => {
            this.trialExpiration = account === null || account.trialEnds === null ?
               null : new Date(account.trialEnds.seconds * 1000);
         })
      } catch (error) {
         console.log(error)
      }
   }

Затем в шаблоне используйте:

   <span *ngIf="trialExpiration != null">
      Trial Expires on {{trialExpiration |  date: 'M/d/yyyy'}}
   </span>

Это работает, но может кто угодно объясните, зачем вызывать секунды на метке времени, а выбрасывает toMillis или toDate?

0 голосов
/ 27 февраля 2020

В вашем файле типа для учетной записи есть триал-концы, определенные как тип отметки времени

import { Timestamp } from '@firebase/firestore-types';

export interface Account {
  trialEnds: Timestamp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...