重新订阅时发生角度对象取消订阅错误



在调用ngOnDestroy并调用unsubscribe:后,我第二次尝试订阅EventEmitter时出现以下错误:

ngOnInit() {
this.route.params.subscribe(params => {
this.resources.eco_id= params['id']
});
this.http.ReloadForm.subscribe(res=>this.OnFormLoad(res));
}
ngOnDestroy(){
this.http.ReloadForm.unsubscribe();
}

core.js:1601错误:对象取消订阅在新的ObjectUnsubscribedError(ObjectUnsubscriptedError.js:6(在EventEmitter.push../node_modules/rxjs_esm5/internal/Subject.js.Subject._trySubscribe(主题js:86(在EventEmitter.push../node_modules/rxjs/\esm5/internal/Observable.js.Obsubscribe(Observable.js:28(在EventEmitter.push../node_modules/@angular/core/fism5/core.js.EventEmitter.subscribe(core.js:3743(在EcoProcedureFormComponent.push../src/app/forms/eco-form/eco-procedure-form-component.ts.EcoProcedureFormComponent.ngOnInit(环保程序表单组件ts:57(在checkAndUpdateDirectiveInline(core.js:10105(在checkAndUpdateNodeInline(core.js:11371(在checkAndUpdateNode(core.js:11333(在prodCheckAndUpdateNode(core.js:11877(在Object.eval[作为更新指令](EcoProcedureFormComponent_Host.nfactory.js:10(

如果没有在ngOnDestroy取消订阅,一切都很好,但我必须以某种方式发布订阅。

我该如何解决?

谢谢

您应该创建一个Subscription变量并将订阅的返回值分配给它。然后在ngOnDestroy方法中,您应该通过调用其unsubscribe方法来释放订阅。

示例:

private routesSubscription: Subscription;
private serviceSubscription: Subscription;
ngOnInit() {
this.routesSubscription = this.route.params.subscribe(params => {
this.resources.eco_id = params['id']
});
this.serviceSubscription = this.http.ReloadForm.subscribe(res => this.OnFormLoad(res));
}
ngOnDestroy(){
if(this.routesSubscription){
this.routesSubscription.unsubscribe();
}
if(this.serviceSubscription){
this.serviceSubscription.unsubscribe();
}
}

如果您想取消订阅多个订阅,您可以使用.add()添加"儿童";订阅。然后您可以同时取消订阅所有订阅。如果你需要更多的控制,只需为每个变量添加变量(甚至将它们分组(。

--更新--

其他解决方案的示例:

示例1:

subscriptions = new Subscription();
someFunc = () => {
this.subscriptions.add(
something.subscribe();
);
}
ngOnDestroy(){
if(this.subscriptions){
this.subscriptions.unsubscribe();
}
}

示例2:

subscriptionGroup: Subscription[]= [];
someFunc = () => {
this.subscriptionGroup.push(something.subscribe())
}
someOtherFunc = () => {
this.subscriptionGroup.push(somethingElse.subscribe())
}
ngOnDestroy(){
this.subscriptionGroup.forEach(subscription => {
subscription.unsubscribe()
}
}

最新更新