【问题标题】:ngOnDestroy not fired when service is provided using useFactory使用 useFactory 提供服务时不会触发 ngOnDestroy
【发布时间】:2019-08-29 21:28:40
【问题描述】:

HelloComponent 获得一个SampleService 实例,定义一个服务提供者。 当HelloCompoment被破坏时,我不明白为什么SampleService会幸存下来。

如果HelloComponent 按类型获得SampleService 实例(避免ServiceProvider),则不会出现问题。


sample-service.ts

@Injectable()
export class SampleService implements OnDestroy{

 constructor(){
   console.log('created new sample service');
 }

 ngOnDestroy(){
  console.log('destroyed sample service');
 }
}

hello-component.ts

import { Component, OnInit, OnDestroy } from '@angular/core'
import { SampleService } from '../service/sample.service'

let ServiceFactory = () => {
  console.log('Providing new SampleService');
  return new SampleService();
};

let ServiceProvider = { 
    provide: SampleService,
    useFactory: ServiceFactory
  };

@Component({
  selector: 'hello',
  templateUrl: './hello.component.html',
  providers: [ServiceProvider]
})
export class HelloComponent implements OnInit, OnDestroy {

constructor(private sampleService: SampleService){}

ngOnInit(){
  console.log("Hello component created!")
}

ngOnDestroy(){
  console.log("Hello component destroyed!")
 }
}

这里是堆栈闪电战:https://stackblitz.com/edit/angular-vkhmma (点击toggleHello并查看控制台日志)

如何在组件结束时强制销毁服务?

【问题讨论】:

标签: angular


【解决方案1】:

这是 Angular 中的 known issue,但(不幸的是)是设计的。

编译时检查OnDestroy回调钩子的存在,并且由于您的ServiceProvider正在包装一个创建SampleService的工厂,不幸的是,Angular编译器不知道这一点hook 甚至存在,所以它永远不会被调用。

【讨论】:

  • 好的,所有报告的问题都已在一年前关闭。我有点困惑,我使用的是最新的稳定版(7.2.x)。顺便说一句,我的服务订阅了一些 $subjects (rxjs) 并且它开始轮询并且永不停止。有什么解决方法吗?
  • 是的,因为 Angular 已经决定设计。我想他们无意解决这个问题。除了直接提供您的服务外,我不确定是否有任何解决方法。你也可以让你的服务只返回一个 observable 但订阅它,然后让调用类订阅它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多