您好,登錄后才能下訂單哦!
ngOnInit和constructor怎么在Angular 中使用?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1. constructor
constructor
應該是ES6中明確使用constructor
來表示構造函數的,構造函數使用在class
中,用來做初始化操作。當包含constructor
的類被實例化時,構造函數將被調用。
來看例子:
class AppComponent { public name: string; constructor(name) { console.log('Constructor initialization'); this.name = name; } } let appCmp = new AppComponent('AppCmp'); // 這時候構造函數將被調用。 console.log(appCmp.name);
轉成ES5代碼如下:
var AppComponent = (function () { function AppComponent(name) { console.log('Constructor initialization'); this.name = name; } return AppComponent; // 這里直接返回一個實例 }()); var appCmp = new AppComponent('AppCmp'); console.log(appCmp.name);
2. ngOnInit
ngOnInit
是Angular
中OnInit
鉤子的實現。用來初始化組件。
Angular中生命周期鉤子的調用順序如下:
ngOnChanges -- 當被綁定的輸入屬性的值發生變化時調用,首次調用一定會發生在ngOnInit()之前。
ngOnInit() -- 在Angular第一次顯示數據綁定和設置指令/組件的輸入屬性之后,初始化指令/組件。在第一輪ngOnChanges()完成之后調用,只調用一次。
ngDoCheck -- 自定義的方法,用于檢測和處理值的改變。
ngAfterContentInit -- 在組件內容初始化之后調用,只適用于組件
ngAfterContentChecked -- 組件每次檢查內容時調用,只適用于組件
ngAfterViewInit -- 組件相應的視圖初始化之后調用,只適用于組件
ngAfterViewChecked -- 組件每次檢查視圖時調用,只適用于組件
ngOnDestroy -- 當Angular每次銷毀指令/組件之前調用并清掃。在這兒反訂閱可觀察對象和分離事件處理器,以防內存泄漏。
在Angular銷毀指令/組件之前調用。
了解了這些之后我們來看一個例子:
import { Component, OnInit } from '@angular/core'; @Component({ selector: 'my-app', template: ` <h2>Welcome to Angular World</h2> `, }) 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
的執行是在先的。
那么既然ngOnchanges
是輸入屬性值變化的時候調用,并且ngOnInit
是在ngOnchanges
執行完之后才調用,而constructor
是在組件就實例化的時候就已經調用了,這也就是說,在constructor
中我們是取不到輸入屬性的值的。
所以還是看例子:
// parent.component.ts import { Component } from '@angular/core'; @Component({ selector: 'exe-parent', template: ` <h2>Welcome to Angular World</h2> <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. 應用場景
看完的上面的部分可以發現,在constructor中不適合進行任何與組件通信類似的復雜操作,一般在constructor中值進行一些簡單的初始化工作:依賴注入,變量初始化等。
那么用到組件間通信的方法我們可以放在ngOnInit中去執行,比如異步請求等:
import { Component, ElementRef, OnInit } from '@angular/core'; @Component({ selector: 'my-app', template: ` <h2>Welcome to Angular World</h2> <p>Hello {{name}}</p> `, }) export class AppComponent implements OnInt { name: string = ''; constructor(public elementRef: ElementRef) { // 使用構造注入的方式注入依賴對象 this.name = 'WXY'; // 執行初始化操作 } ngOnInit() { this.gotId = this.activatedRoute.params.subscribe(params => this.articleId = params['id']); } }
看完上述內容,你們掌握ngOnInit和constructor怎么在Angular 中使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。