服务的生命周期钩子

Mar*_*bek 8 typescript angular2-services angular

我在官方文档和网络上都没有发现 Angular 2 服务是否支持生命周期挂钩的信息。大多数钩子没有意义,但至少ngOnInit()可以非常有用。

实验表明ngOnInit()on an@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);
Run Code Online (Sandbox Code Playgroud)

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

这是故意的吗?如果是这样,它可能应该被记录下来。如果不是,则应更改。

这个问题源于这个(大部分是固定的)问题:

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

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

Ale*_*mov 10

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

当指令、管道或服务被销毁时调用的生命周期钩子。用于在销毁实例时需要进行的任何自定义清理。

至于ngOnInit(),它没有被调用,因为它没有意义:) 您应该将服务初始化逻辑放入其constructor().


Mez*_*van 3

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