2016-03-07 80 views
68

如果我希望函數x在每次組件加載時發生,無論是第一次,我導航到不同的站點並向後導航,或者是組件加載的第五次。Angular 2組件構造函數與OnInit

我應該把函數x放入什麼位置?組件構造函數或OnInit?

回答

70

構造是打字稿類的預定義的默認方法。 Angular和constructor之間沒有關係。通常我們使用constructor來定義/初始化一些變量,但是當我們有與Angular的綁定相關的任務時,我們轉向Angular的ngOnInit生命週期鉤子。在構造函數調用之後調用ngOnInit。我們也可以在構造函數中完成相同的工作,但最好使用ngOnInit來啓動Angular的綁定。

爲了使用ngOnInit我們必須導入從核心庫這個鉤子:

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

然後我們實現與出口類此接口(這不是強制性的,以實現這個接口,但是通常我們所做的)。

同時使用的實例:

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

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

更多細節也見 Difference between Constructor and ngOnInit

+1

但你沒有回答實際的問題。我們應該在這種情況下使用哪一個..? –

+3

在構造函數調用之後不會調用ngOnInit,它們之間有ngOnChanges:https://angular.io/guide/lifecycle-hooks – Hazlo8

22

第一個(構造函數)與類實例化有關,並且與Angular2無關。我的意思是一個構造函數可以用於任何類。您可以爲其新創建的實例進行一些初始化處理。

第二個對應於Angular2組件的生命週期鉤:

  • ngOnChanges當輸入或輸出結合值改變
  • ngOnInit在第一ngOnChanges

所以之後調用被稱爲如果函數的初始化處理依賴於組件的綁定(例如使用定義的組件參數),則應該使用),否則構造函數就足夠了...

+0

有什麼情況下使用'ngOnInit'在構造將是壞? – dman

14

constructor()是一個打字稿功能,並要求new SomeClass()。構造函數確保在類層次結構中正確的字段初始化順序。

ngOnInit是一個Angular2生命週期方法,Angular2在構建組件之後以及在第一次評估綁定和更新輸入之後由Angular調用。

參見Difference between Constructor and ngOnInit

+0

你是100%的權利,我爲你upvote。在我看來,如果我們將'ngOnInit'描述爲React的'componentDidMount',那麼所有的混淆都將消失。但說實話,對於開發者,我們只需要只有一個初始化短語,不管它是否被調用。非常古老的方式是使用像類一樣的函數來構建一個組件類,所以注入作爲參數傳遞並且只需要一個'$ onInit'。 Ng2 +不是一件美麗的藝術品。 – stanleyxu2005

+0

構造函數是一種TypeScript語言功能,具有一定的限制。沒有什麼Angular可以做到這一點。 –