我是自己编程和教学的新手,我搜索了很多网站,但在一些基本原则方面,找不到我在第一个应用程序中遇到的棘手问题的最接近答案。 / p>
我在firestore中有一个树,其中包含有关用户的一些信息(name,bio,dob)。这个用户的密钥与firebase.User中的密钥相同。
我通过authstate订阅当前的firebase.User,然后使用该uid订阅firestore中的我的自定义/用户树。
我有一个返回userObj的服务,但我能获得currentUserObj的唯一方法是在我的所有页面(非DRY)的构造函数中包含包装器。我想创建服务来设置这些对象,然后在我的应用程序中访问,而不必每次都添加样板代码。我已经尝试通过app.module进行设置,以便实例化一次但变量对象在我的其他组件中无法识别。
///我在所有页面中都包含的Boiler版代码
this.afAuth.authState.subscribe((user: firebase.User) => {
if (user) {
this.currentFirebaseUserObj = user
this.userService.getUserObj(this.currentFirebaseUserObj.uid).valueChanges().subscribe(userObj => {
this.currentUserObj = userObj as User;
})
}
})
};
///我通过服务工作的部分
getUserObj(currentUserUid: string) {
return this.afs.doc<User>(`users/${currentUserUid}`)
}
是否有一种方法可以写一次,然后在我的应用程序中提供对这些对象的访问
答案 0 :(得分:1)
如果您想将数据集中到服务中并从应用程序的各个部分访问它,那么您的订阅应该在您的服务中进行。您可以通过在服务的构造函数中订阅您的observable来执行此操作:
export class afAuth {
userObj: User;
constructor(private http: HttpClient) {
// subscribe to getUserObj in here
}
getUserObj(currentUserUid: string) {
return this.afs.doc<User>(`users/${currentUserUid}`)
}
}
查看此实施:https://stackoverflow.com/a/48194096/5116121
另一方面,如果您必须在组件中订阅它,那么一旦您在组件中拥有userObj,您就可以设置&#34;它属于您的服务属性,以后可以从其他组件访问。