Dependency injection angular2中服务的生命周期方法

Dependency injection angular2中服务的生命周期方法,dependency-injection,angular,Dependency Injection,Angular,对于使用@Injectable()注释的服务,是否可能有生命周期挂钩 我本以为会在这样的服务上调用生命周期挂钩,但事实证明我错了,它似乎只在@组件上运行。当依赖项注入创建/销毁服务时,是否有方法在服务中获得通知 import {Component, Injectable, OnInit, OnDestroy} from 'angular2/core'; @Injectable() export class SampleService implements OnInit, OnDestroy {

对于使用
@Injectable()
注释的服务,是否可能有生命周期挂钩

我本以为会在这样的服务上调用生命周期挂钩,但事实证明我错了,它似乎只在
@组件上运行。当依赖项注入创建/销毁服务时,是否有方法在服务中获得通知

import {Component, Injectable, OnInit, OnDestroy} from 'angular2/core';

@Injectable()
export class SampleService implements OnInit, OnDestroy {
    ngOnInit() {
        console.log("OnInit")
    }
    ngOnDestroy() {
        console.log("OnDestroy")
    }
}

@Component({
  selector: "sample",
  template: "<div>Sample Component</div>",
  providers: [ SampleService ]
})
export class SampleComponent {
  constructor() { private _sampleService: SampleService }
}
从'angular2/core'导入{Component,Injectable,OnInit,OnDestroy};
@可注射()
导出类SampleService实现OnInit、OnDestroy{
恩戈尼尼特(){
console.log(“OnInit”)
}
恩贡德斯特罗(){
console.log(“OnDestroy”)
}
}
@组成部分({
选择器:“示例”,
模板:“示例组件”,
提供者:[样本服务]
})
导出类SampleComponent{
构造函数(){private\u sampleService:sampleService}
}

可注入性只是普通类(普通对象),因此,它们没有特殊的生命周期

创建类的对象时,将调用该类的构造函数,因此这就是“OnInit”的含义。至于销毁,服务并不会真正被销毁。唯一可能发生的事情是,一旦不再有对它的引用,它就会被垃圾收集,这很可能发生在依赖项注入器本身被移除之后。但您通常无法控制它,JavaScript中也没有解构器的概念

@Injectable()
export class SampleService {
    constructor() {
        console.log('Sample service is created');
    }
}

您显示的ngOn*生命周期挂钩仅适用于组件。您可以将另一个服务(称之为TrackServiceLifecycles)注入SampleService,并让SampleService的构造函数()调用另一个服务上的方法,以通知它它已创建。但我想不出在SampleService被销毁(垃圾收集)时通知其他服务的方法


另请参见

constructor()
,这可能是我的猜测,我还知道对象会被垃圾收集。由于DI管理对象的生命周期或多或少是通过
提供它的组件的范围来定义的,因此我曾希望即使对于那些对象也会有生命周期方法。不,为组件指定
提供者
只会告诉DI框架在那里使用新的注入器;它并不意味着任何关于如何或何时创建实际对象的内容。例如,您可以使用自定义的
provide()
调用将只创建一次但单独提供(使用单个注入器)的单例对象注入到具有自己生命周期的多个组件中。当服务被销毁时调用。@AlexVauch将告诉您服务被销毁的时间,但它不会让您控制是否实际销毁服务。@poke,这正是钩子的含义:从其他地方调用函数。在这种情况下,当服务的提供者被销毁时,它会自动调用。这不是另一个问题的重复,因为它也提到OnDestroy,而另一个问题只提到OnInit。OnDestroy的文档实际上说明了服务应该支持它。我也被证明是错的。在你的情况下,我认为你采取的方法可能是错误的。可注入/服务只是获取数据等的工具。如果你想要一个生命周期钩子让服务在启动时做一些事情,我建议把
ngOnInit
钩子放在你的主要应用程序组件上,这将调用注入的服务来启动它。基本上使用主应用程序组件启动服务,这将使您的部件保持原样。这都是关于透视的@盖帕克:基本上我就是这么做的。我曾希望服务的生命周期更加自动化,但我理解所涉及的问题,所以是的,这是一个有效的解决方案。