详解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中通过URL传递汉字的方法
Apr 09 Javascript
jquery ajax,ashx,json的用法总结
Feb 12 Javascript
Jquery中CSS选择器用法分析
Feb 10 Javascript
酷炫jQuery全屏3D焦点图动画效果
Mar 22 Javascript
浅谈JS之iframe中的窗口
Sep 13 Javascript
浅谈原型对象的常用开发模式
Jul 22 Javascript
AngularJS中的作用域实例分析
May 16 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
Oct 12 Javascript
详解微信小程序与内嵌网页交互实现支付功能
Oct 22 Javascript
微信小程序开发摇一摇功能
Nov 22 Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 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
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
php查看当前Session的ID实例
2015/03/16 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
Python2手动安装更新pip过程实例解析
2020/07/16 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
施工员岗位职责
2014/03/16 职场文书
联片教研活动总结
2014/07/01 职场文书
应聘教师自荐信
2015/03/26 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL
Moment的feature导致线上bug解决分析
2022/09/23 Javascript