试图使每个用户都可以创建和读取自己的数据。 我正在使用与本教程相同的所有内容,但无法正常运行: https://angularfirebase.com/lessons/managing-firebase-user-relationships-to-database-records/
我的数据库的结构如下:
-|items
-|userId
-|itemId
这是我的服务
userId: string;
constructor(private db: AngularFireDatabase, private afAuth: AngularFireAuth) {
this.afAuth.authState.subscribe(user => {
if(user) this.userId = user.uid
})
}
服务中从数据库获取项目的示例函数:
getRelays(): Observable<any[]> {
if(!this.userId) return;
this.relaysRef = this.db.list('relays/' + this.userId)
return this.relaysRef.snapshotChanges().pipe(
map(changes =>
changes.map(c => ({ $key: c.payload.key, ...c.payload.val() }))
)
);
}
我想访问组件中的当前用户ID,以便我可以基于当前用户获取项目,但是变量userId
仅在订阅中起作用,并且在订阅之外返回未定义。
这是我登录和注销(在另一个组件中)的方式:
login() {
this.afAuth.auth.signInWithPopup(new auth.GoogleAuthProvider());
}
logout() {
this.afAuth.auth.signOut();
}
感谢帮助!
答案 0 :(得分:2)
这是因为可观测值是异步的。由于用户的详细信息是异步的。 userId在订阅方法之外将不可用。因此,您需要在subscribe块中编写逻辑以实现所需的结果。
this.afAuth.authState.subscribe(user => {
if(user) this.userId = user.uid
//you have to write the logic here.
})
答案 1 :(得分:1)
您遇到的问题是因为您正在订阅一个可观察的对象,并且只要发现任何更改,它就会获取带有id的某些数据并更改“ uid”的值。 解决此问题的最佳方法是将“ responce.uid”存储到本地存储中,并在需要时从本地存储中获取该ID。 像这样
sub(".*-(.*)", "\\1", c(text1, text2, text3))
# [1] "Otros" "Escándalo" "Choque"
答案 2 :(得分:0)
您可以创建将存储当前用户数据的服务。
interface IUser {
id: number;
name: string;
}
@Injectable()
export class CurrentUserService {
user: IUser;
}
您的Firebase身份验证代码中的某处:
whenLoggedIn(user: IUser) {
this.currentUserService.user = user;
}
组件
constructor(public currentUserService: CurrentUserService) {}
模板
{{ currentUserService.user.id }}