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