生命周期钩子服务

时间:2017-01-30 18:20:00

标签: angular typescript angular2-services

我没有发现Angular 2服务是否支持生命周期钩子的信息,无论是在官方文档中还是在Web上。大多数钩子没有意义,但至少ngOnInit()非常有用。

实验表明ngOnInit()上的@Injectable()导致服务在引导期间被实例化,即使它没有用户,但是没有被调用。这是一个代码演示:

import { NgModule, Inject, Injectable, OnInit, Component } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

@Component({
  template: 'test',
  selector: 'my-component'
})
export class MyComponent {
}

@Injectable()
export class MyService /*implements OnInit*/ {
  constructor() {
    console.debug('constructing MyService');
  }

  ngOnInit(): void {
    console.debug('MyService.ngOnInit');
  }
}

@NgModule({
  imports: [ BrowserModule ],
  providers: [
    MyService
  ],
  declarations: [MyComponent],
  bootstrap: [ MyComponent ]
})
class AppModule {
}

console.debug('bootstrapping');
platformBrowserDynamic().bootstrapModule(AppModule);

https://plnkr.co/edit/98Q9QqEexYoMRxP3r1Hw?p=info

这是设计的吗?如果是这样,它应该记录在案。如果没有,则应该更改。

此问题源自此(大多数是固定的)问题:

https://github.com/angular/angular/issues/13811

我不清楚方案1(问题的非固定部分)是否是有效代码。

3 个答案:

答案 0 :(得分:2)

在本指南中:https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html声明生命周期钩子仅在指令和组件上调用。所以不幸的是,它们不应该用在服务上。

答案 1 :(得分:1)

在我的测试中,服务上调用了ngOnDestroy,但没有调用ngOnInit

这是Angular@6.1.4。不幸的是我找不到任何文档。

答案 2 :(得分:0)

被Angular 2服务调用的唯一生命周期挂钩是ngOnDestroy()

  

生命周期挂钩,当指令,管道或服务处于   毁了。用于在以下情况下需要进行的任何自定义清除:   实例被破坏。

对于ngOnInit(),由于它没有意义,所以未调用它:)您应该将服务初始化逻辑放入其constructor()