我正在尝试创建一个Firebase应用程序,但是每当刷新页面时都会发生某些事情。
PLACEHOLDER是一个离子项目,其中填充有从firebase.firestore.CollectionReference bookListRef中检索的数据,该数据在称为BooksService的服务中维护,其页面调用的方法为getBookEntries(bookId)。
import { Injectable } from '@angular/core';
import * as firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
import 'firebase/storage';
@Injectable({
providedIn: 'root'
})
export class BooksService {
public bookListRef: firebase.firestore.CollectionReference;
constructor() {
firebase.auth().onAuthStateChanged(user => {
if (user) {
this.bookListRef = firebase.firestore().collection(`/bookList`);
console.log(this.bookListRef);
}
});
}
addBook(authorName: string, bookTitle: string, edition: string): Promise<firebase.firestore.DocumentReference>{
return this.bookListRef.add({
authorLastName: authorName,
title: bookTitle,
edition: edition
}).then((bookRef)=>
bookRef.collection("Entries").add({
page: "PLACEHOLDER",
})
);
}
getBookList(authorLastName): firebase.firestore.Query{
return this.bookListRef.where("authorLastName", "==", authorLastName);
}
getBookEntries(bookId: string): firebase.firestore.CollectionReference{
return this.bookListRef.doc(bookId).collection("Entries");
}
}
}
当我第一次加载页面时,PLACEHOLDER数据加载就很好。但是,当我刷新页面时,由getBookEntries(bookId)执行查询的bookListRef是未定义的。通过在整个代码中插入console.log语句,我发现getBookEntries方法将在构造函数完成bookListRef初始化之前执行。真正令人困惑的是,我正在关注Javabratt的firestore教程EventManager部分,并且这种行为不会出现。在我们各自的服务编写方式以及页面如何调用这些服务方面,我找不到任何根本区别。我在他的示例中添加了console.log语句,并且以某种方式,他的构造函数正在完成Firebase查询并初始化getListDetail()之前的eventListRef 。
该帖子的其余部分详细介绍了我为完成这项工作而付出的努力,并且可以跳过。 谢谢您的阅读。
我一直试图找到一种方法来确保getBookEntries(bookId)直到构造函数完成后才开始执行。我尝试使用while循环来停止getBookEntries(bookId)直到发生初始化,但是控制从未离开循环,而我却被冻结了。我研究了await / async,但是不能在构造函数上使用,并且ngOnInit不能在服务中使用。