为什么ngOnInit()不被调用时,注入类是解析?

Code

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()

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

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


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

从文档中可以看出:

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

如果有人对破坏感兴趣,看看这个问题:


注意:这个答案只适用于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中,你可以正常使用将初始代码放在构造函数中而不是使用ngOnInit()的类,它工作得很好。