Angular多次返回用户信息

时间:2018-01-31 17:25:32

标签: angularjs angular angular2-services

我是自己编程和教学的新手,我搜索了很多网站,但在一些基本原则方面,找不到我在第一个应用程序中遇到的棘手问题的最接近答案。 / 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}`)
  }

是否有一种方法可以写一次,然后在我的应用程序中提供对这些对象的访问

1 个答案:

答案 0 :(得分:1)

如果您想将数据集中到服务中并从应用程序的各个部分访问它,那么您的订阅应该在您的服务中进行。您可以通过在服务的构造函数中订阅您的o​​bservable来执行此操作:

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;它属于您的服务属性,以后可以从其他组件访问。