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()
Ответы
Ответ 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.