【发布时间】:2019-01-22 00:35:42
【问题描述】:
我有一个具有数据服务的 Angular 应用程序
...
@Injectable()
export class DataService {
collectionEndpoint: string;
counters: AngularFirestoreCollection<Counter>;
constructor(private db: AngularFirestore, private authService: AuthService) {
this.collectionEndpoint = "users/" + this.authService.userData.uid + "/counters";
this.counters = db.collection<Counter>(this.collectionEndpoint, ref =>
ref.orderBy("name")
);
getCounters() {
return this.counters.snapshotChanges().pipe(
map(actions =>
actions.map(a => {
const data = a.payload.doc.data() as Counter;
const id = a.payload.doc.id;
return { id, ...data };
})
)
);
}
...
}
在其构造函数中有AuthService。 AuthService如下:
...
Injectable({
providedIn: "root"
})
export class AuthService {
userData: firebase.User;
constructor(
private angularFireAuth: AngularFireAuth
) {
this.angularFireAuth.authState.subscribe(userData => {
if (userData) {
this.userData = userData;
}
});
}
...
}
然后在组件中访问它
export class CounterDashboardComponent {
counters: Observable<Counter[]>;
constructor(private counterService: CounterService) {
this.counters = this.counterService.getCounters();
}
...
}
这是通过*ngFor="let counter of (counters | async)"在html中访问的
当在使用DataService 的路由上刷新页面(正确进入页面)时,它会在 authService 填充该属性之前尝试访问authService.userData.uid(构造函数的第一行)。
如何解决/避免这种情况?
提前谢谢。
【问题讨论】:
-
将调用移出构造函数?
-
通过调用,我猜你的意思是调用填充
this.counters。此数据立即在组件 html 中使用,并且需要在构建时可用。 -
将组件中的
this.counters =...移动到不同的生命周期钩子中。可能是 onInit。 -
这会将问题从构造函数转移到
getCounters(),因为它在未定义的this.counters上调用snapshotChanges()。原谅来回,我仍然对如何解决基本问题感到困惑。
标签: angular typescript firebase-authentication