详解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 相关文章推荐
JSON扫盲帖 JSON.as类教程
Feb 16 Javascript
jQuery 使用手册(二)
Sep 23 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
javascript浏览器窗口之间传递数据的方法
Jan 20 Javascript
针对JavaScript中this指向的简单理解
Aug 26 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
WebSocket实现简单客服聊天系统
May 12 Javascript
bootstrap响应式工具使用详解
Nov 29 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
Mar 17 Javascript
vscode中vue-cli项目es-lint的配置方法
Jul 30 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
Nov 11 Javascript
vue3种table表格选项个数的控制方法
Apr 14 Vue.js
文本溢出插件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
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
Symfony生成二维码的方法
2016/02/04 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
使用js实现数据格式化
2014/12/03 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
python通过Windows下远程控制Linux系统
2018/06/20 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
超市营业员求职简历的自我评价
2013/10/17 职场文书
社区平安建设方案
2014/05/25 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
2016猴年春节慰问信
2015/11/30 职场文书
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python