No se llama a ngOnInit cuando se crea una instancia de la clase Injectable

Resuelto Levi Fuller asked hace 9 años • 5 respuestas

¿ Por qué no se ngOnInit()llama cuando Injectablese resuelve una clase?

Código

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()');
    }

}

Salida de consola

FROM constructor()
Levi Fuller avatar Jan 31 '16 12:01 Levi Fuller
Aceptado

Ganchos de ciclo de vida , como OnInit()trabajar con directivas y componentes. No funcionan con otros tipos, como un servicio en tu caso. De documentos:

Un componente tiene un ciclo de vida administrado por el propio Angular. Angular lo crea, lo representa, crea y representa a sus hijos, lo verifica cuando cambian sus propiedades vinculadas a datos y lo destruye antes de eliminarlo del DOM.

Las instancias de directivas y componentes tienen un ciclo de vida a medida que Angular las crea, actualiza y destruye.

Sasxa avatar Jan 31 '2016 05:01 Sasxa

No conozco todos los enlaces del ciclo de vida, pero en cuanto a la destrucción, ngOnDestroyen realidad me llaman Injectable cuando se destruye su proveedor (por ejemplo, un Injectable suministrado por un componente).

Desde eldocs :

Gancho del ciclo de vida que se llama cuando se destruye una directiva, tubería o servicio .

En caso de que alguien esté interesado en la destrucción , consulte esta pregunta:

SBD580 avatar Jan 23 '2017 08:01 SBD580

Agregando a la respuesta de @Sasxa ,

Puede Injectablesusarlo classnormalmente, es decir, poner el código inicial en constructorlugar de usar ngOnInit(), funciona bien.

Chanel avatar Dec 20 '2020 19:12 Chanel

Nota: esta respuesta se aplica solo a los componentes y directivas de Angular, NO a los servicios.

Tuve el mismo problema cuando ngOnInit(y otros ganchos del ciclo de vida) no se activaban para mis componentes, y la mayoría de las búsquedas me llevaron hasta aquí.

El problema es que estaba usando la sintaxis de la función de flecha ( =>) así:

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

Aparentemente eso no funciona en Angular 6. El uso de una sintaxis de función sin flecha soluciona el problema:

class MyComponent implements OnInit {
    public ngOnInit() {
        console.log("ngOnInit");
    }
}
AJ Richardson avatar May 29 '2018 14:05 AJ Richardson