当Injectable类被实例化时,不会调用ngOnInit

时间:2016-01-31 05:33:22

标签: javascript angular typescript

解决ngOnInit()课程时,为什么没有Injectable被调用?

代码

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

8 个答案:

答案 0 :(得分:250)

Lifecycle hooks,与OnInit()一起使用指令和组件。它们不适用于其他类型,例如您的服务中的服务。来自docs:

  

组件具有由Angular本身管理的生命周期。 Angular创建它,渲染它,创建和渲染它的子节点,在数据绑定属性发生变化时对其进行检查并在将其从DOM中删除之前对其进行破坏。

     

指令和组件实例具有生命周期,因为Angular会创建,更新和销毁它们。

答案 1 :(得分:39)

我不知道所有生命周期钩子,但是对于破坏,ngOnDestroy实际上在它的提供者被销毁时被注入Injectable(例如,由组件提供的Injectable)。

来自docs :

  

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

万一有人对销毁感兴趣,请检查this问题:

答案 2 :(得分:3)

注意:此答案仅适用于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");
    }
}

答案 3 :(得分:3)

我的dataService初始化后,我不得不调用一个函数,而是在对我有用的构造函数内部调用了它。

答案 4 :(得分:1)

添加到@Sasxa 的回答

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

答案 5 :(得分:0)

在服务中,您可以将resolvers用于相同的目的,如本文中所述:https://codeburst.io/understanding-resolvers-in-angular-736e9db71267

  

要了解解析器的用法,让我们看看流程是如何发生的,   当有人点击链接时。

常规路由流程。

  • 用户单击链接。
  • Angular加载各个组件。

使用解析器路由流

  • 用户单击链接。

  • Angular执行某些代码并返回一个值或可观察的值。

  • 您可以在即将加载的组件的类中,在构造函数或ngOnInit中收集返回值或可观察到的值。

  • 将收集的数据用于您的目的。

  • 现在您可以加载组件。

  

第2步,第3步和第4步是使用称为解析器的代码完成的。

答案 6 :(得分:-1)

正如其他人所说,ngOnInit仅适用于组件。

Injectable()服务中使用构造函数。在大多数情况下,它将满足您的需求。

答案 7 :(得分:-1)

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


}