Angular 中 ngOnInit 和 constructor 使用場(chǎng)景

最初學(xué)習(xí)Angular的時(shí)候總是搞不清楚ngOnInitconstructor的區(qū)別官研,現(xiàn)在我們來(lái)稍微理一下兩者之間的區(qū)別侈询。

1. constructor

constructor應(yīng)該是ES6中明確使用constructor來(lái)表示構(gòu)造函數(shù)的循捺,構(gòu)造函數(shù)使用在class中,用來(lái)做初始化操作。當(dāng)包含constructor的類被實(shí)例化時(shí),構(gòu)造函數(shù)將被調(diào)用懂酱。
來(lái)看例子:

class AppComponent {
    public name: string;
    constructor(name) {
        console.log('Constructor initialization');
        this.name = name;
    }
}

let appCmp = new AppComponent('AppCmp');    // 這時(shí)候構(gòu)造函數(shù)將被調(diào)用。
console.log(appCmp.name); 

轉(zhuǎn)成ES5代碼如下:

var AppComponent = (function () {
    function AppComponent(name) {
        console.log('Constructor initialization');
        this.name = name;
    }
    return AppComponent;    // 這里直接返回一個(gè)實(shí)例
}());
var appCmp = new AppComponent('AppCmp');
console.log(appCmp.name);

2. ngOnInit

ngOnInitAngularOnInit鉤子的實(shí)現(xiàn)誊抛。用來(lái)初始化組件列牺。
Angular中生命周期鉤子的調(diào)用順序如下:

  1. ngOnChanges -- 當(dāng)被綁定的輸入屬性的值發(fā)生變化時(shí)調(diào)用,首次調(diào)用一定會(huì)發(fā)生在ngOnInit()之前拗窃。
  2. ngOnInit() -- 在Angular第一次顯示數(shù)據(jù)綁定和設(shè)置指令/組件的輸入屬性之后瞎领,初始化指令/組件。
    在第一輪ngOnChanges()完成之后調(diào)用随夸,只調(diào)用一次九默。
  3. ngDoCheck -- 自定義的方法,用于檢測(cè)和處理值的改變宾毒。
  4. ngAfterContentInit -- 在組件內(nèi)容初始化之后調(diào)用驼修,只適用于組件
  5. ngAfterContentChecked -- 組件每次檢查內(nèi)容時(shí)調(diào)用,只適用于組件
  6. ngAfterViewInit -- 組件相應(yīng)的視圖初始化之后調(diào)用伍俘,只適用于組件
  7. ngAfterViewChecked -- 組件每次檢查視圖時(shí)調(diào)用邪锌,只適用于組件
  8. ngOnDestroy -- 當(dāng)Angular每次銷毀指令/組件之前調(diào)用并清掃。在這兒反訂閱可觀察對(duì)象和分離事件處理器癌瘾,以防內(nèi)存泄漏。
    在Angular銷毀指令/組件之前調(diào)用饵溅。

了解了這些之后我們來(lái)看一個(gè)例子:

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

@Component({
  selector: 'my-app',
  template: `
    <h1>Welcome to Angular World</h1>
  `,
})
export class AppComponent implements OnInit {

  constructor() {
    console.log('Constructor initialization');
  }

  ngOnInit() {
    console.log('ngOnInit hook has been called');
  }
}

這里輸出的是:

Constructor initialization
ngOnInit hook has been called

可以看出妨退,constructor的執(zhí)行是在先的。
那么既然ngOnchanges是輸入屬性值變化的時(shí)候調(diào)用,并且ngOnInit是在ngOnchanges執(zhí)行完之后才調(diào)用咬荷,而constructor是在組件就實(shí)例化的時(shí)候就已經(jīng)調(diào)用了冠句,這也就是說(shuō),在constructor中我們是取不到輸入屬性的值的幸乒。
所以還是看例子:

// parent.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'exe-parent',
  template: `
    <h1>Welcome to Angular World</h1>
    <p>Hello {{name}}</p>
    <exe-child [pname]="name"></exe-child>   <!-- 綁定到子組件的屬性 -->
  `,
})
export class ParentComponent {
  name: string;

  constructor() {
    this.name = 'God eyes';
  }
}
// child.component.ts

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

@Component({
    selector: 'exe-child',
    template: `
     <p>父組件的名稱:{{pname}} </p>
    `
})
export class ChildComponent implements OnInit {
    @Input()
    pname: string; // 父組件的輸入屬性

    constructor() {
        console.log('ChildComponent constructor', this.pname); // this.name=undefined
    }

    ngOnInit() {
        console.log('ChildComponent ngOnInit', this.pname); // this.name=God eyes
    }
}

一目了然懦底。

3. 應(yīng)用場(chǎng)景

看完的上面的部分可以發(fā)現(xiàn),在constructor中不適合進(jìn)行任何與組件通信類似的復(fù)雜操作罕扎,一般在constructor中值進(jìn)行一些簡(jiǎn)單的初始化工作:依賴注入聚唐,變量初始化等。

那么用到組件間通信的方法我們可以放在ngOnInit中去執(zhí)行腔召,比如異步請(qǐng)求等:

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

@Component({
  selector: 'my-app',
  template: `
    <h1>Welcome to Angular World</h1>
    <p>Hello {{name}}</p>
  `,
})
export class AppComponent implements OnInt {
  name: string = '';

  constructor(public elementRef: ElementRef) { // 使用構(gòu)造注入的方式注入依賴對(duì)象
    this.name = 'WXY';                   // 執(zhí)行初始化操作
  }
  
  ngOnInit() {
    this.gotId = this.activatedRoute.params.subscribe(params => this.articleId = params['id']);
  }
}

文章深得semlinker大神的指點(diǎn)杆查。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臀蛛,隨后出現(xiàn)的幾起案子亲桦,更是在濱河造成了極大的恐慌,老刑警劉巖浊仆,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客峭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抡柿,警方通過(guò)查閱死者的電腦和手機(jī)桃笙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沙绝,“玉大人搏明,你說(shuō)我怎么就攤上這事∩撩剩” “怎么了星著?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粗悯。 經(jīng)常有香客問(wèn)我虚循,道長(zhǎng),這世上最難降的妖魔是什么样傍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任横缔,我火速辦了婚禮,結(jié)果婚禮上衫哥,老公的妹妹穿的比我還像新娘茎刚。我一直安慰自己,他們只是感情好撤逢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布膛锭。 她就那樣靜靜地躺著粮坞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪初狰。 梳的紋絲不亂的頭發(fā)上莫杈,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音奢入,去河邊找鬼筝闹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腥光,可吹牛的內(nèi)容都是我干的关顷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柴我,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼解寝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起艘儒,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤聋伦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后界睁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體觉增,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年翻斟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逾礁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡访惜,死狀恐怖嘹履,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情债热,我是刑警寧澤砾嫉,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站窒篱,受9級(jí)特大地震影響焕刮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墙杯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一配并、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧高镐,春花似錦溉旋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)召夹。三九已至岩喷,卻和暖如春恕沫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纱意。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工婶溯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偷霉。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓迄委,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親类少。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叙身,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)硫狞,斷路器信轿,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • Angular 2架構(gòu)總覽 - 簡(jiǎn)書(shū)http://www.reibang.com/p/aeb11061b82c A...
    葡萄喃喃囈語(yǔ)閱讀 1,485評(píng)論 2 13
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,967評(píng)論 6 13
  • “忽如一夜春風(fēng)來(lái),千樹(shù)萬(wàn)樹(shù)梨花開(kāi)”残吩,看過(guò)了财忽,才知道原來(lái)這句話是寫(xiě)實(shí),而不是后知后覺(jué)泣侮。 杏花雨即彪,梨花落,碧云天活尊,還是...
    離人莫嘆閱讀 193評(píng)論 0 1
  • 我們好像已經(jīng)走過(guò)很遠(yuǎn)的路了隶校。但你卻還是沒(méi)有給我跟你走到終點(diǎn)的決心。
    除了看書(shū)還是看書(shū)閱讀 141評(píng)論 0 0