Pourquoi n'est-il pas ngOnInit()
appelé lorsqu'une Injectable
classe est résolue?
Code
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()');
}
}
Sortie de la console
FROM constructor()
javascript
angular
typescript
Levi Fuller
la source
la source
ngOnInit
logique vers le constructeur pour lesInjectable
classes? Je me souviens juste d'avoir lu que vous devriez garder toute logique hors du constructeur pour une raison quelconque.providers
tableaux. Si vous voulez un service singleton, placez-le dans votre module principalproviders
, et si vous voulez des services par composant, ajoutez-les directement au composant.ngOnDestroy
est appelé pour des services injectésJe ne connais pas tous les hooks du cycle de vie, mais en ce qui concerne la destruction, je suis en
ngOnDestroy
fait appelé sur Injectable lorsque son fournisseur est détruit (par exemple un Injectable fourni par un composant).Du
docs :
Juste au cas où quelqu'un serait intéressé par la destruction, vérifiez cette question:
la source
ngOnInit
n'est pas appelée :-( Je voulais vraiment faire de la magie d'initialisation retardée transparente. SingOnDestroy
peut être appelée, je ne vois pas pourquoi init ne peut pasJ'ai dû appeler une fonction une fois mon dataService initialisé, à la place, je l'ai appelée dans le constructeur, cela a fonctionné pour moi.
la source
Remarque: cette réponse s'applique uniquement aux composants et directives angulaires, PAS aux services.
J'ai eu ce même problème lorsque
ngOnInit
(et d'autres hooks de cycle de vie) ne tiraient pas pour mes composants, et la plupart des recherches m'ont conduit ici.Le problème est que j'utilisais la syntaxe de la fonction de flèche (
=>
) comme ceci:class MyComponent implements OnInit { // Bad: do not use arrow function public ngOnInit = () => { console.log("ngOnInit"); } }
Apparemment, cela ne fonctionne pas dans Angular 6. L'utilisation d'une syntaxe de fonction sans flèche résout le problème:
class MyComponent implements OnInit { public ngOnInit() { console.log("ngOnInit"); } }
la source
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() }
la source