Firebase rtdb 无法在构造函数中绑定值
Firebase rtdb cannot bind value in constructor
在我的服务构造函数中,我希望根据用户 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'为空,我的进一步代码不能正常工作。似乎 angular 并没有真正将用户的 id 分配给 this.uid。那我该怎么做才能正确呢?
问题不在于您的 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);
}
当您 运行 此代码打印时:
before subscribing
after subscribing
got uid
这可能不是您预期的顺序,但它正在按设计工作。由于用户数据是从 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);
});
}
另见:
- Using Firebase, firebase.auth().currentUser is a null value even though it is being logged
在我的服务构造函数中,我希望根据用户 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'为空,我的进一步代码不能正常工作。似乎 angular 并没有真正将用户的 id 分配给 this.uid。那我该怎么做才能正确呢?
问题不在于您的 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);
}
当您 运行 此代码打印时:
before subscribing
after subscribing
got uid
这可能不是您预期的顺序,但它正在按设计工作。由于用户数据是从 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);
});
}
另见:
- Using Firebase, firebase.auth().currentUser is a null value even though it is being logged