【问题标题】:Life-cycle methods for services in angular2 [duplicate]angular2中服务的生命周期方法
【发布时间】:2016-07-11 09:08:54
【问题描述】:

是否可以为带有 @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 }
}

【问题讨论】:

  • 这不是另一个问题的重复,因为它还提到了 OnDestroy,而另一个问题只提到了 OnInit。 OnDestroy 的文档实际上声明服务应该支持它。我也被证明是错误的。
  • 就您而言,我认为您采用的方法可能是错误的。 Injectables/Services 只是获取数据等的工具。如果您想要一个生命周期钩子让服务在启动时执行某些操作,我建议将 ngOnInit 钩子放在您的主应用程序组件上,这将调用注入的服务以启动它。基本上使用主应用程序组件来启动服务,这将使您保持原样。这都是关于视角的。 ;)
  • @GuyPark:这基本上就是我作为解决方法所做的。我曾希望服务的生命周期更加自动化,但我理解所涉及的问题,所以是的,这是一个有效的解决方案。

标签: dependency-injection angular


【解决方案1】:

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

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

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

【讨论】:

  • constructor() 可能是我的猜测,而且我也知道对象会被垃圾收集。由于 DI 管理的对象的生命周期或多或少是通过 provides 它的组件范围来定义的,因此我希望即使这些对象也有生命周期方法。
  • 不,为组件指定 providers 只会告诉 DI 框架在那里使用新的注入器;它并不意味着 如何何时 创建实际对象。例如,您可以使用自定义 provide() 调用来注入一个单例对象,该对象只创建一次,但单独(使用单独的注入器)提供给具有自己生命周期的多个组件。
  • ngOnDestroy 在服务被销毁时调用。
  • @AlexVauch 这会告诉你何时服务被销毁,但它不能让你控制实际销毁服务。
  • @poke,这正是 HOOK 的含义:从其他地方调用的函数。在这种情况下,它会在服务提供者被销毁时自动调用。
【解决方案2】:

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

另见ECMAScript 6 class destructor

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2016-08-26
    相关资源
    最近更新 更多