詳解Angular 中 ngOnInit 和 constructor 使用場景
1. constructor
constructor應(yīng)該是ES6中明確使用constructor來表示構(gòu)造函數(shù)的,構(gòu)造函數(shù)使用在class中,用來做初始化操作。當(dāng)包含constructor的類被實(shí)例化時(shí),構(gòu)造函數(shù)將被調(diào)用。
來看例子:
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
ngOnInit是Angular中OnInit鉤子的實(shí)現(xiàn)。用來初始化組件。
Angular中生命周期鉤子的調(diào)用順序如下:
- ngOnChanges -- 當(dāng)被綁定的輸入屬性的值發(fā)生變化時(shí)調(diào)用,首次調(diào)用一定會(huì)發(fā)生在ngOnInit()之前。
- ngOnInit() -- 在Angular第一次顯示數(shù)據(jù)綁定和設(shè)置指令/組件的輸入屬性之后,初始化指令/組件。在第一輪ngOnChanges()完成之后調(diào)用,只調(diào)用一次。
- ngDoCheck -- 自定義的方法,用于檢測和處理值的改變。
- ngAfterContentInit -- 在組件內(nèi)容初始化之后調(diào)用,只適用于組件
- ngAfterContentChecked -- 組件每次檢查內(nèi)容時(shí)調(diào)用,只適用于組件
- ngAfterViewInit -- 組件相應(yīng)的視圖初始化之后調(diào)用,只適用于組件
- ngAfterViewChecked -- 組件每次檢查視圖時(shí)調(diào)用,只適用于組件
- ngOnDestroy -- 當(dāng)Angular每次銷毀指令/組件之前調(diào)用并清掃。在這兒反訂閱可觀察對(duì)象和分離事件處理器,以防內(nèi)存泄漏。
在Angular銷毀指令/組件之前調(diào)用。
了解了這些之后我們來看一個(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)用了,這也就是說,在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)用場景
看完的上面的部分可以發(fā)現(xiàn),在constructor中不適合進(jìn)行任何與組件通信類似的復(fù)雜操作,一般在constructor中值進(jì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']);
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Angular發(fā)布1.5正式版,專注于向Angular 2的過渡
Angular團(tuán)隊(duì)最近發(fā)布了Angular 1.5的正式版,該版本實(shí)現(xiàn)了一次重大的升級(jí),它讓仍在使用1.X版本的開發(fā)者將能夠更容易地過渡到Angular 2的開發(fā)2016-02-02
實(shí)踐中學(xué)習(xí)AngularJS表單
表單是最常用的一種組建。在Angular.js中,其實(shí)并沒有單獨(dú)的為表單添加多少特殊功能。但是,利用Angular.js框架本身的特點(diǎn),可以更友好的呈現(xiàn)表單。下面將介紹幾種常用的功能在Angular中是如何巧妙實(shí)現(xiàn)的2016-03-03
angular中的http攔截器Interceptors的實(shí)現(xiàn)
本篇文章主要介紹了angular中的http攔截器Interceptors的實(shí)現(xiàn)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
angular動(dòng)態(tài)刪除ng-repaeat添加的dom節(jié)點(diǎn)的方法
本篇文章主要介紹了angular動(dòng)態(tài)刪除ng-repaeat添加的dom節(jié)點(diǎn)的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-07-07
Angular應(yīng)用的多語言設(shè)置問題解決示例
這篇文章主要為大家介紹了Angular應(yīng)用的多語言設(shè)置問題解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
基于?angular?material?theming?機(jī)制修改?mat-toolbar?的背景色(示例詳解
最近在學(xué)習(xí)?angular,記錄一下昨天的進(jìn)展,解決的問題是通過?theme?的配置修改?mat-toolbar?的背景色,避免對(duì)色彩的硬編碼,這篇文章主要介紹了基于?angular?material?theming?機(jī)制修改?mat-toolbar?的背景色,需要的朋友可以參考下2022-10-10
AngularJs ng-route路由詳解及實(shí)例代碼
這篇文章主要介紹了AngularJs ng-route路由,這里整理相關(guān)資料及簡單實(shí)例代碼,有興趣的小伙伴可以參考下2016-09-09
Angular.js之作用域scope''@'',''='',''&''實(shí)例詳解
這篇文章主要介紹了Angular.js之作用域scope'@','=','&'實(shí)例詳解,需要的朋友可以參考下2017-02-02
AngularJS使用ng-class動(dòng)態(tài)增減class樣式的方法示例
這篇文章主要介紹了AngularJS使用ng-class動(dòng)態(tài)增減class樣式的方法,結(jié)合具體實(shí)例形式分析了ng-class操作頁面class樣式的相關(guān)技巧,需要的朋友可以參考下2017-05-05

