Javascript 实例化可注入类时不调用ngOnInit

Javascript 实例化可注入类时不调用ngOnInit,javascript,angular,typescript,Javascript,Angular,Typescript,解析可注入类时,为什么不调用ngOnInit() 代码 import {Injectable, OnInit} from 'angular2/core'; import { RestApiService, RestRequest } from './rest-api.service'; @Injectable() export class MovieDbService implements OnInit { constructor(private _movieDbRest: Rest

解析
可注入类时,为什么不调用
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()
,例如
OnInit()
使用指令和组件。它们不适用于其他类型,例如您的案例中的服务。从文档:

组件有自己管理的生命周期。Angular会创建它,渲染它,创建并渲染它的子对象,在它的数据绑定属性更改时检查它,并在将它从DOM中删除之前销毁它

指令和组件实例具有创建、更新和销毁它们的生命周期


我不知道所有的生命周期钩子,但是对于销毁,
ngondestory
实际上在其提供程序被销毁时(例如,组件提供的可注入程序)会调用Injectable

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


以防有人对销毁检查问题感兴趣:

注意:此答案仅适用于角度组件和指令,而不适用于服务。

ngOnInit
(以及其他生命周期挂钩)没有为我的组件启动时,我也遇到了同样的问题,大多数搜索都将我带到了这里

问题是我使用的箭头函数语法(
=>
)如下所示:

class MyComponent implements OnInit {
    // Bad: do not use arrow function
    public ngOnInit = () => {
        console.log("ngOnInit");
    }
}
显然,这在第六章中不起作用。使用非箭头函数语法解决了以下问题:

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

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

通过@Sasxa添加到answer中

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

@Injectable()
export class MovieDbService implements OnInit {

userId:number=null;

constructor(private _movieDbRest: RestApiService,
            private instanceMyService : Service ){

   // do evreything like OnInit just on services

   this._movieDbRest.callAnyMethod();

   this.userId = this.instanceMyService.getUserId()


}

Injectables
中,您可以正常地使用
class
将初始代码放入
constructor
中,而不是使用
ngOnInit()
,它工作得很好。

所以只需将我的
ngOnInit
逻辑移动到
Injectable
类的构造函数中?我刚刚记得读过一篇文章,说无论出于什么原因,你都应该将任何逻辑排除在构造函数之外。@LeviFuller是的,对于服务,你可以在构造函数中进行初始化,或者最好创建init方法并从构造函数中调用它(以防你以后需要重置服务)。这与绑定无关。当您希望等待解析输入值时,可以使用它,因为它们在构造函数中不可用。构造函数可以被多次调用。例如,当您更改路由并加载不同的组件时,它们每次都会被“构造”并销毁……这里还值得注意的是,服务可以多次实例化,具体取决于您在
提供程序
数组中包含它们的位置。如果您想要单例服务,请将其放在主模块的
提供程序中,如果您想要每个组件的服务,请直接将其添加到组件中。这并非完全错误,正如@SBD580在他的回答中指出的那样,
ngondestry
是为注入服务调用的。这不是一个耻辱
ngOnInit
:-(我真的很想做一些透明的延迟初始化魔术。如果可以调用
ngondestry
,我不明白为什么init不能被捕获的类是服务,而不是组件。OP询问一个服务。虽然从语言POV中你的答案可能是正确的,但它不能回答这个问题。你应该删除它。@AndrewPhilips,而我的use案例与OP略有不同,OP是谷歌搜索“ngOnInit not called”的一种搜索方式我的回答不是为了帮助OP,而是为了帮助其他70000多名观众,他们可能对
ngOnInit
有类似的问题。这很公平。我相信我见过这么多的问答,其中一位作者提问,然后回答他们自己的问题。作为一名新的Angular程序员,你的回答会让我困惑两周从SO和NG的角度来看,我认为你的答案值得提出自己的问题,因此没有被删除,而是“重新分类”。谁知道呢?也许它可能会吸引更广泛的观众。干杯。有意义-我编辑我的答案是为了明确这不是服务。这个问题是“callAnyMethod”只能是同步方法,不能等待。。。