Angular 与订阅的可观察对象相关的注销权限错误

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); } 用户必须经过身份验证才能查看此组件,我有一个路由保护程序来确保这一点 但是,当我注销时,会出现以下错误

我有一个组件,在其中我订阅了一个可观察的组件,以从Firebase中提取数据。相关的订阅代码如下所示:

[注意:更新/更正了下面的代码。]

//在我的组件中
恩戈尼尼特(){
//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
确实是解决方案的一部分。非常感谢。