详解Angular 中 ngOnInit 和 constructor 使用场景


Posted in Javascript onJune 22, 2017

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

ngOnInitAngularOnInit钩子的实现。用来初始化组件。

Angular中生命周期钩子的调用顺序如下:

  1. ngOnChanges -- 当被绑定的输入属性的值发生变化时调用,首次调用一定会发生在ngOnInit()之前。
  2. ngOnInit() -- 在Angular第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。在第一轮ngOnChanges()完成之后调用,只调用一次。
  3. ngDoCheck -- 自定义的方法,用于检测和处理值的改变。
  4. ngAfterContentInit -- 在组件内容初始化之后调用,只适用于组件
  5. ngAfterContentChecked -- 组件每次检查内容时调用,只适用于组件
  6. ngAfterViewInit -- 组件相应的视图初始化之后调用,只适用于组件
  7. ngAfterViewChecked -- 组件每次检查视图时调用,只适用于组件
  8. ngOnDestroy -- 当Angular每次销毁指令/组件之前调用并清扫。在这儿反订阅可观察对象和分离事件处理器,以防内存泄漏。

在Angular销毁指令/组件之前调用。

了解了这些之后我们来看一个例子:

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的执行是在先的。

那么既然ngOnchanges是输入属性值变化的时候调用,并且ngOnInit是在ngOnchanges执行完之后才调用,而constructor是在组件就实例化的时候就已经调用了,这也就是说,在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. 应用场景

看完的上面的部分可以发现,在constructor中不适合进行任何与组件通信类似的复杂操作,一般在constructor中值进行一些简单的初始化工作:依赖注入,变量初始化等。

那么用到组件间通信的方法我们可以放在ngOnInit中去执行,比如异步请求等:

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) { // 使用构造注入的方式注入依赖对象
  this.name = 'WXY';          // 执行初始化操作
 }

 ngOnInit() {
  this.gotId = this.activatedRoute.params.subscribe(params => this.articleId = params['id']);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript下利用fso判断文件是否存在的代码
Dec 11 Javascript
jQuery中siblings()方法用法实例
Jan 08 Javascript
JQuery中基础过滤选择器用法实例分析
May 18 Javascript
JavaScript继承模式粗探
Jan 12 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
May 11 Javascript
node.js中fs文件系统目录操作与文件信息操作
Feb 24 Javascript
vue获取当前点击的元素并传值的实例
Mar 09 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
Nov 12 Javascript
原生js实现贪食蛇小游戏的思路详解
Nov 26 Javascript
浅析Vue下的components模板使用及应用
Nov 27 Javascript
微信小程序实现搜索功能
Mar 10 Javascript
微信小程序实现聊天室功能
Jun 14 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 #jQuery
详解Vue 2.0封装axios笔记
Jun 22 #Javascript
EasyUI中的dataGrid的行内编辑
Jun 22 #Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
Jun 22 #Javascript
vue 请求后台数据的实例代码
Jun 22 #Javascript
深入理解vue.js中的v-if和v-show
Jun 22 #Javascript
vue如何从接口请求数据
Jun 22 #Javascript
You might like
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
php 特殊字符处理函数
2008/09/05 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python爬虫爬取网页表格数据
2018/03/07 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python3.5安装python3-tk详解
2019/04/26 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
英国袜子店:Sock Shop
2017/01/11 全球购物
幼儿园五一活动方案
2014/02/07 职场文书
综合实践活动方案
2014/02/14 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
学习雷锋主题班会
2015/08/14 职场文书
mysql优化
2021/04/06 MySQL