Angular2中服务的生命周期方法

37

在用@Injectable()注释的服务中,是否可能拥有生命周期钩子?

我本来以为像这样的服务会调用生命周期钩子,但事实证明我错了,它似乎只适用于@Component。在依赖注入创建/销毁服务时,有没有一种方法可以让服务知道并被通知呢?

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 }
}

4
这不是另一个问题的重复,因为它还提到了OnDestroy,而另一个问题只提到了OnInit。OnDestroy的文档实际上指出服务应该支持它。我也被证明是错误的。 - Patrick Graham
在您的情况下,我认为您采取的方法可能是错误的。Injectables/Services只是获取数据等工具。如果您想要一个生命周期钩子,在启动时让服务执行某些操作,我建议将ngOnInit钩子放在您的主应用程序组件上,这将调用注入的服务来启动它。基本上使用主应用程序组件来启动服务,这将使您的部分保持不变。这一切都取决于观点。;) - Guy Park
@GuyPark:这基本上是我作为解决方法所做的。我曾希望服务的生命周期更加自动化,但我理解其中涉及的问题,所以是的,这是一个有效的解决方案。 - Martin C.
2个回答

33

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

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

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

"constructor()" 可能是我的猜测,我也知道对象会被垃圾回收。由于 DI 管理的对象的生命周期或多或少地由 "provide" 它的组件的范围定义,因此我希望即使对于那些对象也有生命周期方法。 - Martin C.
不,为组件指定“提供程序”只是告诉DI框架在那里使用新的注入器;这并不意味着实际对象创建的方式或时间。例如,您可以使用自定义的provide()调用来注入单例对象,该对象仅创建一次,但单独提供(带有各自的注入器)给具有自己生命周期的多个组件。 - poke
9
当一个服务被销毁时,会调用ngOnDestroy方法。 - Alex Vauch
3
那个命令可以告诉你服务被销毁的时间,但它无法让你控制实际销毁服务的过程。 - poke
1
@poke,这正是HOOK的定义:一个从其他地方调用的函数。在这种情况下,当服务提供者被销毁时,它会自动调用。 - Fredrik_Borgstrom

10

您展示的ngOn*生命周期钩子只适用于组件。您可以将另一个服务(称其为TrackServiceLifecycles)注入SampleService,并使SampleService的constructor()调用另一个服务上的方法来通知它已被创建。但我想不到一种方法来在SampleService被销毁(垃圾回收)时通知其他服务。

另请参见ECMAScript 6类解构函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接