ngOnInit не вызывается при создании класса Injectable

Почему нет 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()

7 ответов

Решение

Крючки жизненного цикла, как OnInit() работа с директивами и компонентами. Они не работают с другими типами, как сервис в вашем случае. Из документов:

Компонент имеет жизненный цикл, управляемый самой Angular. Angular создает его, отображает, создает и отображает его дочерние элементы, проверяет его, когда изменяются его свойства, связанные с данными, и уничтожает его перед удалением из DOM.

Директивы и экземпляры компонентов имеют жизненный цикл, так как Angular создает, обновляет и уничтожает их.

Я не знаю обо всех хуках жизненного цикла, но что касается уничтожения, ngOnDestroy фактически вызывается для Injectable, когда его провайдер уничтожается (например, Injectable, предоставляемый компонентом).

От docs :

Хук жизненного цикла, который вызывается при разрушении директивы, канала или службы.

Если кто-то заинтересован в уничтожении, проверьте этот вопрос:

Добавление к ответу @Sasxa,

В Injectablesвы можете использовать classобычно это ввод исходного кода в constructorвместо использования ngOnInit(), работает нормально.

У меня была такая же проблема, когда ngOnInit (и другие хуки жизненного цикла) не запускали мои компоненты, и большинство поисков привело меня сюда.

Проблема в том, что я использовал синтаксис функции стрелки (=>) как это:

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

По-видимому, это не работает в Angular 6. Использование синтаксиса функции без стрелки решает проблему:

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

Мне пришлось вызвать функцию после инициализации моего dataService, вместо этого я вызвал ее внутри конструктора, который у меня сработал.

мы можем запустить его, поместив в конструктор. Но по какой причине 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()


}
Другие вопросы по тегам