我没有找到关于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(问题的非固定部分)是否是有效代码。
在本指南中:https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html声明生命周期钩子仅在指令和组件上调用。所以不幸的是,它们不应该用在服务上。
在我的测试中,ngOnDestroy
被调用,但ngOnInit
没有被调用服务。
这是[email protected]。不幸的是我找不到任何文件。
为Angular 2服务调用的唯一生命周期钩子是ngOnDestroy()
:
在销毁指令,管道或服务时调用的生命周期钩子。用于在销毁实例时需要进行的任何自定义清理。
至于ngOnInit()
,它没有被调用,因为它没有意义:)你应该将服务初始化逻辑放入其constructor()
。