2016-03-07 20 views
68

Jeśli chcę, aby funkcja x działała za każdym razem, gdy komponent ładuje, po raz pierwszy, przechodzę do innej witryny i nawiguję wstecz lub po raz piąty komponent został załadowany.Angular 2 Konstruktor komponentów Vs OnInit

Co powinienem wstawić funkcję x? Konstruktor komponentów lub OnInit?

Odpowiedz

70

Konstruktor jest predefiniowaną domyślną metodą klasy maszynopis. Nie ma związku między Angular i constructor. Zwykle używamy constructor do definiowania/inicjowania niektórych zmiennych, ale kiedy mamy zadania związane z wiązaniami Angulara, przechodzimy do haka cyklu życia Angulara ngOnInit. ngOnInit jest wywoływana tuż po wywołaniu konstruktora. Możemy również wykonać tę samą pracę w konstruktorze, ale lepiej jest użyć ngOnInit, aby rozpocząć wiązanie Angulara.

w celu wykorzystania ngOnInit musimy importować ten hak z biblioteki rdzenia:

import {Component, OnInit} from '@angular/core' 

Następnie wdrożymy ten interfejs z eksportowanego klasy (nie jest to obowiązkowe, aby wdrożyć ten interfejs, ale ogólnie zrobiliśmy).

Przykład wykorzystania zarówno:

export class App implements OnInit{ 
    constructor(){ 
    //called first time before the ngOnInit() 
    } 

    ngOnInit(){ 
    //called after the constructor and called after the first ngOnChanges() 
    } 
} 

Więcej szczegółów patrz także Difference between Constructor and ngOnInit

+1

Ale nie odpowiedziałeś na prawdziwe pytanie. który z nich powinniśmy użyć w tym przypadku ..? –

+3

ngOnInit nie jest wywoływany zaraz po wywołaniu konstruktora, między nimi jest ngOnChanges: https://angular.io/guide/lifecycle-hooks – Hazlo8

22

Pierwszy (konstruktor) jest powiązany z instancją klasy i nie ma nic wspólnego z Angular2. Mam na myśli, że konstruktor może być użyty na dowolnej klasie. Można w nim umieścić pewne przetwarzanie inicjacji dla nowo utworzonej instancji.

Drugi odpowiada hakiem cyklu życia komponentów Angular2:

  • ngOnChanges nazywa gdy wartość wiązania wejście lub wyjście zmienia
  • ngOnInit nazywa się po pierwszym ngOnChanges

So powinieneś użyć ngOnInit, jeśli przetwarzanie inicjalizacji twojej funkcji zależy od powiązań komponentu (na przykład parametry komponentu zdefiniowane przez @Input), w przeciwnym razie konstruktor będzie wystarczający ...

+0

Czy istnieją sytuacje, w których przy użyciu 'ngOnInit' przez konstruktora byłoby źle? – dman

14

constructor() to narzędzie maszynopisujące się pod numerem new SomeClass(). Konstruktor zapewnia prawidłową kolejność inicjalizacji pól w hierarchiach klas.

ngOnInit to metoda cyklu życia Angular2, która jest wywoływana przez Angular, gdy jest tworzona komponent, a po oszacowaniu powiązań i zaktualizowała dane wejściowe po raz pierwszy.

Zobacz także Difference between Constructor and ngOnInit

+0

Masz 100% racji i zrobiłem dla ciebie awans. Moim zdaniem, jeśli określimy 'ngOnInit' jako" componentDidMount "React, całe zamieszanie zniknie. Ale szczerze mówiąc, dla programistów, po prostu potrzebujemy mieć tylko jedną frazę inicjalizacyjną, bez względu na to, jak się ją nazywa. Bardzo starą drogą jest użycie funkcji podobnej do klasy, aby zbudować klasę komponentów, więc wtrysk jest przekazywany jako argumenty i potrzebujesz tylko jednego '$ onInit'. Ng2 + nie jest kawałkiem pięknej grafiki. – stanleyxu2005

+0

Konstruktor jest funkcją języka TypeScript z pewnymi ograniczeniami. Nie ma nic, co Angular mógłby z tego zrobić. –