【问题标题】:Angular return user info multiple timesAngular多次返回用户信息
【发布时间】:2018-01-31 17:25:32
【问题描述】:

我是编程和自学的新手,我搜索了很多网站,但对于我在第一个应用中遇到的一个棘手问题,就一些基本原则而言,我找不到最接近的答案。

我在 Firestore 中有一棵树,其中包含有关用户的一些信息(姓名、简历、出生日期)。此用户的密钥与 firebase.User 中的密钥相同。

我通过 authstate 订阅当前的 firebase.User,然后使用该 uid 订阅我在 firestore 中的自定义 /users 树。

我有一个返回 userObj 的服务,但我可以获得 currentUserObj 的唯一方法是将包装器包含在我所有页面的构造函数中(非 DRY)。我想创建服务来设置这些对象,然后在我的应用程序中进行访问,而无需每次都添加样板代码。我尝试通过 app.module 进行设置,以便实例化一次,但在我的其他组件中无法识别变量对象。

///我在所有页面中都包含的样板代码

   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}`)
  }

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

【问题讨论】:

    标签: angularjs angular angular2-services


    【解决方案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,你就可以将它“设置”为你的服务的一个属性,以后可以从其他的组件。

    【讨论】:

    • 感谢您的回复,该帖子确实有帮助。我遵循了建议并在服务中订阅了我的组件,然后在组件中公开了注入的服务。我需要使用服务在组件中返回的对象,而不是模板。目前我可以访问userObjs。任何的想法?编辑。我在组件中使用了这个,这意味着我没有所有的代码,它只是我正在寻找从服务返回对象的格式 this.currentUserObj = userService.currentUserObj this.currentFirebaseUserObj = userService.currentFirebaseUserObj跨度>
    • 可以通过 this.afAuth 访问,我可以通过 userService.currentUserObj 访问它,但只是尝试在其余代码之前加载它,因为我有未定义的错误
    • 在这种情况下,您可能需要将服务的创建转移到更高级别的组件中,例如将其放入应用模块的 providers 数组中。
    • 我在看这个并且在我的 app.module.ts 中有 [UserServiceProvider]。有没有一种特定的方法可以通过服务访问这个更高级别组件的返回?
    • @Lee 不,在这种情况下,由于您的组件依赖于服务中的数据,因此您可以尝试在获得此数据之前阻止加载组件。例如,如果您使用选择器,请使用 并且只有在数据到达时才应该创建组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2015-09-02
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多