Angular fournit un crochet de cycle de vie ngOnInit
par défaut.
Pourquoi devrait ngOnInit
être utilisé, si nous en avons déjà un constructor
?
angular
typescript
ngoninit
Haseena PA
la source
la source
Réponses:
La
Constructor
est une méthode par défaut de la classe qui est exécutée lorsque la classe est instanciée et garantit une initialisation correcte des champs dans la classe et ses sous-classes. L'injecteur de dépendance angulaire, ou mieux, analyse les paramètres du constructeur et lorsqu'il crée une nouvelle instance en l'appelant,new MyClass()
il essaie de trouver des fournisseurs qui correspondent aux types des paramètres du constructeur, les résout et les transmet au constructeur commengOnInit
est un hook de cycle de vie appelé par Angular pour indiquer que Angular a terminé la création du composant.Nous devons importer
OnInit
comme ceci pour l'utiliser (en fait, la mise en œuvreOnInit
n'est pas obligatoire mais considérée comme une bonne pratique):puis pour utiliser make us of the method
OnInit
, nous devons implémenter la classe comme ceci:Généralement, nous utilisons
ngOnInit
pour toutes les initialisations / déclarations et évitons que les choses fonctionnent dans le constructeur. Le constructeur ne doit être utilisé que pour initialiser les membres de la classe mais ne doit pas faire de "travail" réel.Vous devez donc utiliser
constructor()
pour configurer l'injection de dépendance et pas grand-chose d'autre. ngOnInit () est un meilleur endroit pour "démarrer" - c'est où / quand les liaisons des composants sont résolues.Pour plus d'informations, référez-vous ici:
https://angular.io/api/core/OnInit
Constructeur de composants angulaires contre OnInit
la source
tsconfig.json
fichier comme"strict": true
, vous devez initialiser les membres de la classe dans leconstructor
, pas dans lengOnit
mêmeFormGroup
.L'article La différence essentielle entre Constructor et ngOnInit dans Angular explore la différence sous plusieurs angles. Cette réponse fournit l'explication de la différence la plus importante liée au processus d'initialisation des composants, qui montre également les différences d'utilisation.
Le processus de bootstrap angulaire comprend les deux étapes principales:
Le constructeur du composant est appelé lorsque Angular construit l'arborescence des composants. Tous les hooks du cycle de vie sont appelés dans le cadre de l'exécution de la détection des modifications.
Lorsque Angular construit l'arborescence des composants, l'injecteur du module racine est déjà configuré afin que vous puissiez injecter toutes les dépendances globales. De plus, lorsque Angular instancie une classe de composant enfant, l'injecteur du composant parent est également déjà configuré de sorte que vous pouvez injecter des fournisseurs définis sur le composant parent, y compris le composant parent lui-même. Les constructeurs de composants sont la seule méthode qui est appelée dans le contexte de l'injecteur, donc si vous avez besoin d'une dépendance, c'est le seul endroit pour obtenir ces dépendances.
Lorsque Angular démarre la détection des modifications, l'arborescence des composants est construite et les constructeurs de tous les composants de l'arborescence ont été appelés. Les nœuds de modèle de chaque composant sont également ajoutés au DOM. Le
@Input
mécanisme de communication est traité pendant la détection des modifications, vous ne pouvez donc pas vous attendre à ce que les propriétés soient disponibles dans le constructeur. Il sera disponible aprèsngOnInit
.Voyons un exemple rapide. Supposons que vous ayez le modèle suivant:
Angular démarre donc le démarrage de l'application. Comme je l'ai dit, il crée d'abord des classes pour chaque composant. Il appelle donc
MyAppComponent
constructeur. Il crée également un nœud DOM qui est l'élément hôte dumy-app
composant. Il procède ensuite à la création d'un élément hôte pour le constructeurchild-comp
appelantChildComponent
. À ce stade, il n'est pas vraiment concerné par lai
liaison d'entrée et les crochets du cycle de vie. Ainsi, lorsque ce processus est terminé, Angular se retrouve avec l'arborescence de vues de composants suivante:Ce n'est qu'alors qu'exécute la détection des modifications et met à jour les liaisons pour les
my-app
appels etngOnInit
sur la classe MyAppComponent. Il procède ensuite à la mise à jour des liaisons pour leschild-comp
appels etngOnInit
sur la classe ChildComponent.Vous pouvez faire votre logique d'initialisation dans l'un ou l'autre constructeur ou
ngOnInit
selon ce dont vous avez besoin disponible. Par exemple, l'article Voici comment obtenir ViewContainerRef avant que la requête @ViewChild soit évaluée montre quel type de logique d'initialisation peut être requis pour être exécuté dans le constructeur.Voici quelques articles qui vous aideront à mieux comprendre le sujet:
la source
the constructor should only be used to inject dependencies
.Je pense que le meilleur exemple serait d'utiliser les services. Disons que je veux récupérer des données de mon serveur lorsque mon composant est «activé». Disons que je veux aussi faire des choses supplémentaires aux données après les avoir obtenues du serveur, peut-être que je reçois une erreur et que je veux les enregistrer différemment.
C'est vraiment facile avec ngOnInit sur un constructeur, cela limite également le nombre de couches de rappel que je dois ajouter à mon application.
Par exemple:
avec mon constructeur, je pourrais simplement appeler mon _userService et remplir ma liste d'utilisateurs, mais peut-être que je veux faire des choses supplémentaires avec. Par exemple, assurez-vous que tout est en majuscules, je ne sais pas exactement comment mes données transitent.
Il est donc beaucoup plus facile d'utiliser ngOnInit.
Cela le rend beaucoup plus facile à voir, et donc j'appelle simplement ma fonction dans mon composant lorsque j'initialise au lieu de devoir creuser ailleurs. Vraiment, ce n'est qu'un autre outil que vous pouvez utiliser pour le rendre plus facile à lire et à utiliser à l'avenir. Je trouve aussi que c'est vraiment une mauvaise pratique de mettre des appels de fonction dans un constructeur!
la source
getUsers
puis l'insérez-vous dansngOnInit
? N'est-ce pas moins de code que de simplement l'écrire dans ngOnInit? Je me demande encore pourquoi les gens le font de cette façon? Est-ce pour que vous puissiez réutiliser le code si vous le vouliez aussi? Merci.constructor
?constructor(private _userService: UserService){ this.getUsers(); };
OK, tout d'abord
ngOnInit
fait partie du cycle de vie angulaire , tout enconstructor
faisant partie de la classe JavaScript ES6 , donc la différence majeure commence ici! ...Regardez le tableau ci-dessous que j'ai créé qui montre le cycle de vie d'Angular.
Dans Angular2 +, nous utilisons
constructor
pour le faireDI(Dependency Injection)
pour nous, tandis que dans Angular 1, cela se produisait en appelant la méthode String et en vérifiant quelle dépendance était injectée.Comme vous le voyez dans le diagramme ci-dessus,
ngOnInit
se produit une fois que le constructeur est prêtngOnChnages
et se déclenche une fois que le composant est prêt pour nous. Toute initialisation peut se produire à ce stade, un simple échantillon injecte un service et le paraphe sur init.OK, je partage également un exemple de code pour que vous puissiez regarder, voir comment nous utilisons
ngOnInit
etconstructor
dans le code ci-dessous:la source
Le premier (constructeur) est lié à l'instanciation de classe et n'a rien à voir avec Angular2. Je veux dire qu'un constructeur peut être utilisé sur n'importe quelle classe. Vous pouvez y mettre un traitement d'initialisation pour l'instance nouvellement créée.
Le second correspond à un hook de cycle de vie des composants Angular2:
Cité sur le site officiel d'angular:
Vous devez donc utiliser
ngOnInit
si le traitement d'initialisation repose sur les liaisons du composant (par exemple les paramètres de composant définis avec@Input
), sinon le constructeur suffirait ...la source
Je vais juste ajouter une chose importante qui a été ignorée dans les explications ci-dessus et explique quand vous DEVEZ l' utiliser
ngOnInit
.Si vous faites une quelconque manipulation du DOM du composant via par exemple ViewChildren , ContentChildren ou ElementRef , vos éléments natifs ne seront pas disponibles pendant la phase du constructeur.
Cependant, puisque
ngOnInit
cela se produit une fois que le composant a été créé et que les vérifications (ngOnChanges
) ont été appelées, vous pouvez accéder au DOM à ce stade.la source
@ViewChildren
particulier, vous devez utiliser langAfterViewInit
méthode. Voir ici: stackoverflow.com/questions/46314734/…Une réponse courte et simple serait:
Constructor
:constructor
est unedefault method
exécution ( par sourdult ) lors de la construction du composant. Lorsque vous créezan instance
une classe, ce tempsconstructor(default method)
sera également appelé. En d'autres termes, lorsque le composant estconstructed or/and an instance is created constructor(default method)
appelé et que le code pertinent écrit à l'intérieur est appelé. Fondamentalement et généralement,Angular2
il injectait des choses commeservices
lorsque le composant est en cours de construction pour une utilisation ultérieure.OnInit
: ngOnInit est le hook du cycle de vie du composant qui s'exécute en premier après l'constructor(default method)
initialisation du composant.Ainsi, votre constructeur sera appelé en premier et Oninit sera appelé plus tard après la méthode du constructeur.
boot.ts
Ressources: crochet LifeCycle
Vous pouvez vérifier cette petite démo qui montre l'implémentation des deux choses.
la source
new MyClass()
est exécuté. Je pense qu'il est trompeur de dire que les constructeurs concernent les composants, ils concernent les classes et l'initialisation des instances de ces classes. Un composant se trouve juste être une telle classe. Sinon, je pense que c'est une bonne réponse.constructor
est également appelé. Mais cette réponse a été écrite dans un contexte angulaire2. Pour connaître la meilleure réponse, vous devez connaître les bases des POO. Je vais quand même mettre à jour la réponse.Comme beaucoup d'autres langages, vous pouvez initialiser des variables au niveau de la classe, du constructeur ou d'une méthode. C'est au développeur de décider ce qui est le mieux dans son cas particulier. Mais voici une liste des meilleures pratiques en matière de décision.
Variables au niveau de la classe
Habituellement, vous déclarerez ici toutes vos variables qui seront utilisées dans le reste de votre composant. Vous pouvez les initialiser si la valeur ne dépend pas d'autre chose, ou utiliser le mot-clé const pour créer des constantes si elles ne changent pas.
Constructeur
Normalement, il est préférable de ne rien faire dans le constructeur et de l'utiliser uniquement pour les classes qui seront injectées. La plupart du temps, votre constructeur devrait ressembler à ceci:
cela créera automatiquement les variables au niveau de la classe, vous aurez donc accès à
customService.myMethod()
sans avoir à le faire manuellement.NgOnInit
NgOnit est un hook de cycle de vie fourni par le framework Angular 2. Votre composant doit implémenter
OnInit
pour pouvoir l'utiliser. Ce hook de cycle de vie est appelé après l'appel du constructeur et toutes les variables sont initialisées. La majeure partie de votre initialisation devrait aller ici. Vous aurez la certitude qu'Angular a correctement initialisé votre composant et vous pouvez commencer à faire la logique dont vous avez besoin parOnInit
rapport à faire des choses lorsque votre composant n'a pas fini de se charger correctement.Voici une image détaillant l'ordre de ce qui s'appelle:
https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html
TLDR
Si vous utilisez le framework Angular 2 et devez interagir avec certains événements du cycle de vie, utilisez les méthodes fournies par le framework pour éviter les problèmes.
la source
Pour tester cela, j'ai écrit ce code, empruntant au Tutoriel NativeScript :
user.ts
login.component.ts
Sortie console
la source
La principale différence entre le constructeur et
ngOnInit
est ce quengOnInit
est le crochet du cycle de vie et court après le constructeur. Le modèle interpolé par composant et les valeurs initiales d'entrée ne sont pas disponibles dans le constructeur, mais ils sont disponibles dansngOnInit
.La différence pratique est de savoir comment
ngOnInit
affecte la structure du code. La plupart du code d'initialisation peut être déplacé versngOnInit
- tant que cela ne crée pas de conditions de concurrence .Constructeur antipattern
Une quantité importante de code d'initialisation rend la méthode constructeur difficile à étendre, à lire et à tester.
Une recette habituelle pour séparer la logique d'initialisation du constructeur de classe est de la déplacer vers une autre méthode comme
init
:ngOnInit
peut servir cet objectif dans les composants et les directives:Injection de dépendance
Le rôle principal des constructeurs de classes dans Angular est l'injection de dépendances. Les constructeurs sont également utilisés pour l'annotation DI dans TypeScript. Presque toutes les dépendances sont affectées en tant que propriétés à l'instance de classe.
Le constructeur de composant / directive moyen est déjà suffisamment grand car il peut avoir une signature multiligne en raison de dépendances, ce qui met une logique d'initialisation inutile dans le corps du constructeur contribue à l'anti-modèle.
Initialisation asynchrone
Le constructeur d'initialisation asynchrone peut souvent être considéré comme anti-modèle et avoir une odeur car l'instanciation de classe se termine avant la routine asynchrone, ce qui peut créer des conditions de concurrence. Si ce n'est pas le cas,
ngOnInit
et d'autres crochets de cycle de vie sont de meilleurs endroits pour cela, en particulier parce qu'ils peuvent bénéficier de laasync
syntaxe:S'il y a des conditions de concurrence (y compris celle qu'un composant ne devrait pas apparaître lors d'une erreur d'initialisation), la routine d'initialisation asynchrone doit avoir lieu avant l'instanciation du composant et être déplacée vers le composant parent, la protection du routeur, etc.
Tests unitaires
ngOnInit
est plus flexible qu'un constructeur et offre certains avantages pour les tests unitaires qui sont expliqués en détail dans cette réponse .Étant donné que ce
ngOnInit
n'est pas appelé automatiquement lors de la compilation des composants dans les tests unitaires, les méthodes qui sont appelées dansngOnInit
peuvent être espionnées ou moquées après l'instanciation des composants.Dans des cas exceptionnels, il
ngOnInit
peut être entièrement tronqué pour isoler d'autres unités de composants (par exemple, une logique de modèle).Héritage
Les classes enfants ne peuvent qu'augmenter les constructeurs, pas les remplacer.
Puisqu'il
this
ne peut pas être référencé auparavantsuper()
, cela impose des restrictions sur la priorité d'initialisation.Étant donné que le composant angulaire ou la directive utilise
ngOnInit
pour la logique d'initialisation insensible au temps, les classes enfants peuvent choisir si ellesuper.ngOnInit()
est appelée et quand:Cela serait impossible à implémenter avec le constructeur seul.
la source
Les réponses ci-dessus ne répondent pas vraiment à cet aspect de la question d'origine: qu'est-ce qu'un crochet de cycle de vie? Il m'a fallu un certain temps pour comprendre ce que cela signifie jusqu'à ce que j'y pense de cette façon.
1) Supposons que votre composant soit un être humain. Les humains ont une vie qui comprend de nombreuses étapes de la vie, puis nous expirons.
2) Notre composant humain pourrait avoir le script de cycle de vie suivant: né, bébé, école primaire, jeune adulte, adulte à mi-âge, adulte senior, mort, éliminé.
3) Dites que vous voulez avoir une fonction pour créer des enfants. Pour éviter que cela ne devienne compliqué et plutôt humoristique, vous voulez que votre fonction ne soit appelée que pendant la phase jeune adulte de la vie de la composante humaine. Vous développez donc un composant qui n'est actif que lorsque le composant parent est au stade Jeune adulte. Les crochets vous aident à le faire en signalant cette étape de la vie et en laissant votre composant agir dessus.
Truc amusant. Si vous laissez votre imagination aller à coder quelque chose comme ça, cela devient compliqué et drôle.
la source
Le constructeur est une méthode en JavaScript et est considéré comme une caractéristique de la classe dans es6. Lorsque la classe est instanciée, elle exécute immédiatement le constructeur, qu'elle soit utilisée dans le cadre Angular ou non. Elle est donc appelée par le moteur JavaScript et Angular n'a pas contrôler cela.
La classe "ConstructorTest" est instanciée ci-dessous, elle appelle donc en interne le constructeur (tout cela se fait par JavaScript (es6) no Angular).
C'est pourquoi il existe un hook de cycle de vie ngOnInit dans le rendu Angular.ngOnInit lorsque Angular a terminé l'initialisation du composant.
D'abord, nous instancions la classe comme ci-dessous qui arrive aux exécutions immédiates de la méthode constructeur.
ngOnInit est appelé par Angular si nécessaire comme ci-dessous:
Mais vous vous demandez peut-être pourquoi nous utilisons le constructeur dans Angular?
La réponse est des injections de dépendances .Comme il est mentionné précédemment, le constructeur appelle par le moteur JavaScript immédiatement lorsque la classe est instanciée (avant d'appeler ngOnInit par Angular), donc typescript nous aide à obtenir le type des dépendances sont définies dans le constructeur et indique finalement Angulaire quel type de dépendances nous voulons utiliser dans ce composant spécifique.
la source
Deux choses à observer ici:
Les deux ont une convivialité différente.
la source
constructor () est la méthode par défaut dans le cycle de vie du composant et est utilisé pour l'injection de dépendances. Le constructeur est une fonctionnalité tapuscrit.
ngOnInit () est appelé après le constructeur et ngOnInit est appelé après les premiers ngOnChanges.
c'est à dire:
Constructeur () -->ngOnChanges () -->ngOnInit ()
comme mentionné ci-dessus
ngOnChanges()
est appelé lorsqu'une valeur de liaison d'entrée ou de sortie change.la source
Les deux méthodes ont des objectifs / responsabilités différents. La tâche du constructeur (qui est une fonctionnalité prise en charge par le langage) est de s'assurer que l'invariant de représentation est respecté. Autrement dit pour vous assurer que l'instance est valide en donnant des valeurs correctes aux membres. C'est au développeur de décider ce que signifie «correct».
La tâche de la méthode onInit () (qui est un concept angulaire) est de permettre des invocations de méthode sur un objet correct (représentation invariante). Chaque méthode doit à son tour s'assurer que l'invariant de représentation est valable à la fin de la méthode.
Le constructeur doit être utilisé pour créer des objets «corrects», la méthode onInit vous donne la possibilité d'appeler des appels de méthode à une instance bien définie.
la source
Constructeur: La méthode constructeur sur une classe ES6 (ou TypeScript dans ce cas) est une caractéristique d'une classe elle-même, plutôt qu'une caractéristique angulaire. Cela n'est pas sous le contrôle d'Angular lorsque le constructeur est invoqué, ce qui signifie que ce n'est pas un hook approprié pour vous faire savoir quand Angular a fini d'initialiser le composant. Le moteur JavaScript appelle le constructeur, pas directement Angular. C'est pourquoi le hook de cycle de vie ngOnInit (et $ onInit dans AngularJS) a été créé. Gardant cela à l'esprit, il existe un scénario approprié pour utiliser le constructeur. C'est à ce moment que nous voulons utiliser l'injection de dépendances - essentiellement pour «relier» les dépendances au composant.
Comme le constructeur est initialisé par le moteur JavaScript, et TypeScript nous permet d'indiquer à Angular les dépendances dont nous avons besoin pour être mises en correspondance avec une propriété spécifique.
ngOnInit est purement là pour nous indiquer qu'Angular a fini d'initialiser le composant.
Cette phase inclut la première passe à la détection de changement par rapport aux propriétés que nous pouvons lier au composant lui-même - comme l'utilisation d'un décorateur @Input ().
Pour cette raison, les propriétés @Input () sont disponibles dans ngOnInit, mais ne sont pas définies dans le constructeur, par conception
la source
Le constructeur est le premier, et cela arrive parfois lorsque les données @input sont nulles! nous utilisons donc Constructor pour déclarer des services et ngOnInit se produit après. Exemple pour contrutor:
Exemple pour onInit:
Je pense que onInit est comme InitialComponents () dans winForm.
la source
Dans les cycles de vie angulaires
1) L'injecteur angulaire détecte les paramètres constructeurs et instancie la classe.
2) Cycle de vie du prochain appel angulaire
Crochets de cycle de vie angulaire
ngOnChanges -> Appel de la liaison des paramètres de la directive.
ngOnInit -> Démarrer le rendu angulaire ...
Appelez une autre méthode avec l'état du cycle de vie angulaire.
la source
Le
constructor
est appelé lorsque Angular "instancie / construit" le composant. LangOnInit
méthode est un hook qui représente la partie d'initialisation du cycle de vie des composants. Une bonne pratique consiste à ne l'utiliser que pour l' injection de services :Même si c'est possible, vous ne devriez pas faire de "travail" à l'intérieur. Si vous souhaitez lancer une action qui doit se produire lors de l'initialisation du composant, utilisez
ngOnInit
:De plus, les actions qui impliquent des propriétés d'entrée , provenant d'un composant parent, ne peuvent pas être effectuées dans le constructeur. Ils doivent être placés dans la
ngOnInit
méthode ou un autre crochet. Il en va de même pour les éléments liés à la vue (le DOM), par exemple les éléments viewchild :la source
constructor()
est utilisé pour faire l'injection de dépendance.ngOnInit()
,ngOnChanges()
EtngOnDestroy()
etc. sont des méthodes du cycle de vie.ngOnChanges()
sera le premier à être appelé, avantngOnInit()
, lorsque la valeur d'une propriété liée change, elle ne sera PAS appelée s'il n'y a pas de changement.ngOnDestroy()
est appelé lorsque le composant est supprimé. Pour l'utiliser,OnDestroy
doit êtreimplement
édité par la classe.la source
J'ai trouvé la réponse et j'ai essayé de la traduire en anglais: Cette question se posait toujours, même dans les entretiens techniques. En fait, il y a une grande ressemblance entre les deux, mais il y a aussi quelques différences.
Le constructeur fait partie d'ECMAScript. D'un autre côté, ngOnInit () est une notion angulaire.
Nous pouvons appeler les constructeurs dans toutes les classes même si nous n'utilisons pas Angular
LifeCycle: le constructeur est appelé avant ngOnInt ()
Dans le constructeur, nous ne pouvons pas appeler d'éléments HTML. Cependant, dans ngOnInit (), nous le pouvons.
Généralement, les appels de services dans le ngOnInit () et non dans le constructeur
Source: http://www.angular-tuto.com/Angular/Component#Diff
la source
Constructeur
La fonction constructeur est fournie avec chaque classe, les constructeurs ne sont pas spécifiques à Angular mais sont des concepts dérivés de conceptions orientées objet. Le constructeur crée une instance de la classe de composants.
OnInit
La
ngOnInit
fonction est l'une des méthodes de cycle de vie d'un composant angulaire. Les méthodes de cycle de vie (ou hooks) dans les composants angulaires vous permettent d'exécuter un morceau de code à différentes étapes de la vie d'un composant. Contrairement à la méthode constructeur, langOnInit
méthode provient d'une interface angulaire (OnInit
) que le composant doit implémenter pour utiliser cette méthode. LangOnInit
méthode est appelée peu de temps après la création du composant.la source
Le constructeur est exécuté lorsque la classe est instanciée. Cela n'a rien à voir avec l'angulaire. C'est la fonction de Javascript et Angular n'en a pas le contrôle
NgOnInit est spécifique à Angular et est appelé lorsque Angular a initialisé le composant avec toutes ses propriétés d'entrée.
Les propriétés @Input sont disponibles sous le hook de cycle de vie ngOnInit. Cela vous aidera à faire des choses d'initialisation comme obtenir des données du serveur principal, etc. pour les afficher dans la vue
Les propriétés @Input sont affichées comme indéfinies dans le constructeur
la source
Le constructeur est une fonction exécutée lorsque le composant (ou une autre classe) est construit.
ngOnInit est une fonction appartenant à des groupes de méthodes de cycle de vie d'un composant et ils sont exécutés à un moment différent de notre composant (c'est pourquoi nommer cycle de vie). Voici une liste de tous:
Le constructeur sera exécuté avant toute fonction du cycle de vie.
la source