Подтвердить что ты не робот

NgOnInit не вызывается, когда инъецируемый класс инициализируется

Почему вызов 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()
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Из docs :

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

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

Ответ 3

Примечание: этот ответ относится только к угловым компонентам и директивам, а НЕ к услугам.

У меня была такая же проблема, когда ngOnInit (и другие хуки жизненного цикла) не 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");
    }
}

Ответ 4

Методы жизненного цикла для служб уже охвачены другими, я разделяю свои понятия о методах жизненного цикла вообще

Angular 4 метода жизненного цикла

ngOnInit(), ngOnChanges() и ngOnDestroy() и т.д. - это методы жизненного цикла. ngOnChanges() будет первым, который будет вызываться, до ngOnInit(), когда значение связанного свойства изменится, оно НЕ будет вызываться, если нет изменений. ngOnDestroy() вызывается при удалении компонента. Чтобы использовать его, OnDestroy должен быть implement ed классом.

Ответ 5

В вашем сервисе вы можете использовать resolvers для той же цели, как описано в этом посте: https://codeburst.io/understanding-resolvers-in-angular-736e9db71267

Чтобы понять использование распознавателей, давайте посмотрим, как происходит поток, когда кто-то нажимает на ссылку.

Общий маршрут маршрутизации.

  • Пользователь нажимает на ссылку.
  • Угловая нагрузка на соответствующий компонент.

Маршрутизация с помощью Resolver

  • Пользователь нажимает на ссылку.

  • Angular выполняет определенный код и возвращает значение или наблюдаемый.

  • Вы можете собрать возвращенное значение или наблюдаемое в конструкторе или в ngOnInit, в классе вашего компонента, который собирается загрузить.

  • Используйте собранные данные для ваших целей.

  • Теперь вы можете загрузить свой компонент.

Шаги 2, 3 и 4 выполняются с помощью кода под названием Resolver.