Angular 与订阅的可观察对象相关的注销权限错误
我有一个组件,在其中我订阅了一个可观察的组件,以从Firebase中提取数据。相关的订阅代码如下所示: [注意:更新/更正了下面的代码。]Angular 与订阅的可观察对象相关的注销权限错误,angular,firebase,firebase-authentication,angularfire2,Angular,Firebase,Firebase Authentication,Angularfire2,我有一个组件,在其中我订阅了一个可观察的组件,以从Firebase中提取数据。相关的订阅代码如下所示: [注意:更新/更正了下面的代码。] //在我的组件中 恩戈尼尼特(){ //this.af是注入的AngularFire2实例 this.tasks=this.af.database.list(“/tasks”) .subscribe(tasks=>this.tasks=tasks); } 用户必须经过身份验证才能查看此组件,我有一个路由保护程序来确保这一点 但是,当我注销时,会出现以下错误
//在我的组件中
恩戈尼尼特(){
//this.af是注入的AngularFire2实例
this.tasks=this.af.database.list(“/tasks”)
.subscribe(tasks=>this.tasks=tasks);
}
用户必须经过身份验证才能查看此组件,我有一个路由保护程序来确保这一点
但是,当我注销时,会出现以下错误:
客户端没有访问所需数据的权限
我正在使用以下内容注销:
//this.auth是一个注入的FirebaseAuth实例
this.auth.logout();
this.router.navigate(['/login']);
错误发生在调用路由器导航方法之前。问题是,我有一个打开的web套接字连接的active tasks observer订阅,该连接在调用注销
方法后立即出错,因为用户不再经过身份验证
任务订阅和注销功能位于我的应用程序的不同部分。如果他们在同一个地方,我想我可以在注销时调用订阅上的unsubscribe
方法。但即便如此,在我的注销方法中坚持这种取消订阅的逻辑似乎很混乱。我不太清楚如何处理这件事
如何处理注销时取消对tasks observer的订阅
Alexander Leonov关于重复赋值的评论后更新的代码
Alexander指出我两次分配给this.tasks
属性。说得好!这段代码不正确。我没有将订阅分配给属性。代码应该是这样的:
// in my component
ngOnInit() {
this.subscription = this.af.database.list('/tasks')
.subscribe(tasks => this.tasks = tasks);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
ngOnInit(){
//this.af是注入的AngularFire2实例
此.af.database.list(“/tasks”)
.subscribe(tasks=>this.tasks=tasks);
}
谢谢你指出这一点,亚历山大
解决方案:我最终做了什么
亚历山大·列昂诺夫(Alexander Leonov)关于在我的组件中使用ngondestory
取消订阅的评论部分地解决了这个问题
在“我的任务”组件中使用他的代码:
ngOnInit(){
this.subscription=this.af.database.list(“/tasks”)
.subscribe(tasks=>this.tasks=tasks);
}
恩贡德斯特罗(){
this.subscription.unsubscripte();
}
解决方案的另一部分涉及订阅我的顶级组件AppComponent中的AngularFire auth。如果经过身份验证,它将重定向到一条路由;如果没有,它将重定向到另一个路由:
this.authService.auth$.subscribe((当前用户)=>{
如果(当前用户){
this.router.navigate(['/tasks']);
}否则{
this.router.navigate(['/login']);
}
});
注销时,将通知此订阅,并将用户重定向到登录路径。这一系列事件最终触发我的组件上的ngondestory
方法,该方法取消订阅AngularFire observable的任务。您有点搞砸了。您可以使用this.tasks
两者来保留订阅:
this.tasks = this.af.database.list(...)
以及以后作为任务存储:
subscribe(tasks => this.tasks = tasks)
您需要选择力的一侧。:)
要回答您的问题,需要更多关于您的应用程序如何工作的信息。如果您在用户登录时在ngOnInit()中初始化连接,那么我猜在注销时您的组件会被杀死,所以您也可以实现OnDestroy并在那里杀死订阅,类似这样:
// in my component
ngOnInit() {
this.subscription = this.af.database.list('/tasks')
.subscribe(tasks => this.tasks = tasks);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
啊,福吉!我反复阅读了这个问题的文本,但没有注意到这个代码错误。我从更复杂的代码中提取,试图将其提取成一种形式,以显示问题的本质。但是我的翻译是错误的。我没有将订阅分配给属性。对不起,让我更新我的代码。谢谢你的回复,顺便说一句!我刚刚尝试了ngondestry
方法。我将订阅分配给了一个组件对象属性,然后按照您的建议使用它取消订阅,但仍然收到一个“权限拒绝”错误。使用this.auth.logout()
取消身份验证的行为似乎不会触发组件上的ngondestory
回调。啊,ngondestory
确实是解决方案的一部分。非常感谢。