Dlaczego nie jest ngOnInit()
wywoływany, gdy Injectable
klasa jest rozstrzygana?
Kod
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()');
}
}
Wyjście konsoli
FROM constructor()
javascript
angular
typescript
Levi Fuller
źródło
źródło
ngOnInit
logikę do konstruktora dlaInjectable
klas? Właśnie przypomniałem sobie, że z jakiejkolwiek przyczyny powinieneś trzymać konstruktor w logice.providers
tablicach. Jeśli chcesz skorzystać z usługi singleton, umieść ją w module głównymproviders
, a jeśli chcesz, aby usługi dla poszczególnych komponentów dodawały je bezpośrednio do komponentu.ngOnDestroy
wezwanie do wstrzykniętych usługNie wiem o wszystkich hakach cyklu życia, ale jeśli chodzi o zniszczenie,
ngOnDestroy
faktycznie wywoływany jest na Injectable, gdy jego dostawca jest zniszczony (na przykład Injectable dostarczany przez komponent).Od
docs :
Jeśli ktoś jest zainteresowany zniszczeniem, sprawdź to pytanie:
źródło
ngOnInit
nie jest nazywany :-( Naprawdę chciałem wykonać przezroczystą magię opóźnionej inicjalizacji. JeślingOnDestroy
można to nazwać, nie rozumiem, dlaczego init nie możeUwaga: ta odpowiedź dotyczy tylko komponentów i dyrektyw Angular, NIE usług.
Miałem ten sam problem, gdy
ngOnInit
(i inne haki cyklu życia) nie strzelały do moich komponentów, a większość wyszukiwań doprowadziła mnie tutaj.Problem polega na tym, że używałem składni funkcji strzałki (
=>
) w następujący sposób:Najwyraźniej to nie działa w Angular 6. Użycie składni funkcji innej niż strzałka rozwiązuje problem:
źródło
ngOnInit
.Musiałem wywołać funkcję po zainicjowaniu mojej usługi danych, zamiast tego nazwałem ją w konstruktorze, który działał dla mnie.
źródło
źródło