当可注入类被实例化时,ngOnInit未被调用

解析Injectable类时为什么不调用ngOnInit() ?

代码

import {Injectable, OnInit} from 'angular2/core';
import { RestApiService, RestRequest } from './rest-api.service';


@Injectable()
export class MovieDbService implements OnInit {


constructor(private _movieDbRest: RestApiService){
window.console.log('FROM constructor()');
}


ngOnInit() {
window.console.log('FROM ngOnInit()');
}


}

控制台输出

FROM constructor()
172593 次浏览

生命周期的钩子,像OnInit()一样使用指令和组件。它们不能与其他类型一起工作,比如您的例子中的服务。从文档:

组件有一个由Angular自己管理的生命周期。Angular创建它,渲染它,创建并渲染它的子节点,在它的数据绑定属性发生变化时检查它,并在从DOM中移除它之前销毁它。

指令和组件实例在Angular创建、更新和销毁它们时都有一个生命周期。

我不知道所有的生命周期钩子,但至于销毁,当它的提供者被销毁时,ngOnDestroy实际上会在Injectable上被调用(例如组件提供的Injectable)。

docs :

当指令、管道或服务被销毁时调用的生命周期钩子。

以防有人对破坏感兴趣,检查问题:

注意:这个答案只适用于Angular的组件和指令,不适用于服务。

ngOnInit(和其他生命周期钩子)没有为我的组件启动时,我有同样的问题,大多数搜索将我引导到这里。

问题是我像这样使用箭头函数语法(=>):

class MyComponent implements OnInit {
// Bad: do not use arrow function
public ngOnInit = () => {
console.log("ngOnInit");
}
}

显然,这在Angular 6中不起作用。使用非箭头函数语法修复了这个问题:

class MyComponent implements OnInit {
public ngOnInit() {
console.log("ngOnInit");
}
}

我必须在我的dataService初始化后调用一个函数,相反,我在构造函数中调用它,这对我来说是有效的。

通过@Sasxa添加答案,

Injectables中,你可以正常使用class,这是将初始代码放在constructor中,而不是使用ngOnInit(),它工作正常。