Как мы можем получить доступ к ненаблюдаемому набору данных из Firestore Firebase? - PullRequest
1 голос
/ 11 марта 2019

Фон

В большинстве примеров извлечения данных из FireStore Firebase через AngularFire:

(a) показано использование Observable<any[]> для извлечения данных:

export class AppComponent {
  items: Observable<any[]>;
  constructor(db: AngularFirestore) {
    this.items = db.collection('items').valueChanges();
  }
}

(б) связать его с шаблоном, используя канал к async:

<ul>
  <li class="text" *ngFor="let item of items | async">
    {{item.name}}
  </li>
</ul>

Ситуация

Я не вижу примеров того, как просто получить data: SomeModel[] и НЕ data: Observable<SomeModel[]> ... после некоторой борьбы я нашел обходной путь:

    async getData(): Promise<SomeModel[]> {
        return await new Promise((resolve, reject) => {
            this.myCollection.snapshotChanges().subscribe(data => {
                this.data = data.map(e => {
                  return {
                    id: e.payload.doc.id,
                    ...e.payload.doc.data()
                  };
                });
                resolve(this.data);
            });
        });
    }

Вопрос

Но, как новичок в этой конкретной области, мое решение кажется надуманным, и я ищу, каксделать это наилучшим образом.Спасибо за ваше время!

1 Ответ

1 голос
/ 11 марта 2019

Вы должны использовать асинхронный канал вместо установки свойства экземпляра, потому что асинхронный канал обрабатывает отмену подписки на onDestory. но если вы действительно хотите присвоить результат свойству, просто назначьте его в subscribe ()

 getModel():Observable<MyModel[]>{
         this.myCollection.snapshotChanges().map((data) => {
            return this.data = data.map(e => {
              return {
                id: e.payload.doc.id,
                ...e.payload.doc.data()
              };
            });
        });
    }  

 this.getModel().subscribe(data=>this.data=data)  
...