【问题标题】:Firebase rtdb cannot bind value in constructorFirebase rtdb 无法在构造函数中绑定值
【发布时间】:2020-11-08 12:06:49
【问题描述】:

在我的服务的构造函数中,我希望根据用户 id(uid) 设置数据库的动态路径

 private dbPath = '/pages';
 private uid = '';
constructor(private db: AngularFireDatabase, private as: AuthService) {
   as.afAuth.user.subscribe(user => {
     this.uid = user.uid; 
     console.log(this.uid); //result: '12312313'(id of user)
   });
   this.userFormsRef = db.list(this.uid + '/' + this.dbPath);
   console.log(this.uid);  // result: '' (nothing)
 }

如 'uid' 为 null,我的进一步代码无法正常工作。似乎 Angular 并没有真正将用户的 id 分配给 this.uid。那我该怎么做才能正确呢?

【问题讨论】:

    标签: javascript angular firebase firebase-realtime-database angularfire2


    【解决方案1】:

    问题不在于您的this.uid 是否被设置,而是何时设置。您可以通过添加一些日志记录最轻松地看到这一点:

     private dbPath = '/pages';
     private uid = '';
     constructor(private db: AngularFireDatabase, private as: AuthService) {
       console.log('before subscribing');
       as.afAuth.user.subscribe(user => {
         console.log('got uid');
         this.uid = user.uid; 
         console.log(this.uid); //result: '12312313'(id of user)
       });
       console.log('after subscribing');
       this.userFormsRef = db.list(this.uid + '/' + this.dbPath);
     }
    

    当您运行此代码时,它会打印:

    订阅前

    订阅后

    得到用户名

    这可能不是您期望的顺序,但它按设计工作。由于用户数据是从 Firebase 异步加载的,因此您的主代码将继续运行。然后当用户数据可用时,执行你的回调。

    所以当你的db.list(this.uid + '/' + this.dbPath) 运行时,this.uid = user.uid 还没有运行。因此,任何需要用户数据的代码都需要在回调中,或者从那里调用。

    类似这样的:

     private dbPath = '/pages';
     private uid = '';
     constructor(private db: AngularFireDatabase, private as: AuthService) {
       as.afAuth.user.subscribe(user => {
         this.uid = user.uid; 
         this.userFormsRef = db.list(this.uid + '/' + this.dbPath);
       });
     }
    

    另见:

    【讨论】:

    • 这是一个很好的解释,现在我的代码运行良好/
    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2014-06-05
    相关资源
    最近更新 更多