Почему не вызывается 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()

Ответы (6)

Крючки жизненного цикла, такие как 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 вы можете использовать class обычно, то есть поместить начальный код в constructor вместо использования ngOnInit(), это работает нормально.

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


}

2022 WebDevInsider