详解Angular之constructor和ngOnInit差异及适用场景


Posted in Javascript onJune 22, 2017

Angular中根据适用场景定义了很多生命周期函数,其本质上是事件的响应函数,其中最常用的就是ngOnInit。但在TypeScript或ES6中还存在着名为constructor的构造函数,开发过程中经常会混淆二者,毕竟它们的含义有某些重复部分,那ngOnInit和constructor之间有什么区别呢?它们各自的适用场景又是什么呢?

区别

constructor是ES6引入类的概念后新出现的东东,是类的自身属性,并不属于Angular的范畴,所以Angular没有办法控制constructor。constructor会在类生成实例时调用:

import {Component} from '@angular/core';

@Component({
  selector: 'hello-world',
  templateUrl: 'hello-world.html'
})

class HelloWorld {
  constructor() {
    console.log('constructor被调用,但和Angular无关');
  }
}

// 生成类实例,此时会调用constructor
new HelloWorld();

既然Angular无法控制constructor,那么ngOnInit的出现就不足为奇了,毕竟枪把子得握在自己手里才安全。

ngOnInit的作用根据官方的说法:

ngOnInit用于在Angular第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。

ngOnInit属于Angular生命周期的一部分,其在第一轮ngOnChanges完成之后调用,并且只调用一次:

import {Component, OnInit} from '@angular/core';

@Component({
  selector: 'hello-world',
  templateUrl: 'hello-world.html'
})

class HelloWorld implements OnInit {
  constructor() {

  }

  ngOnInit() {
    console.log('ngOnInit被Angular调用');
  }
}

constructor适用场景

即使Angular定义了ngOnInit,constructor也有其用武之地,其主要作用是注入依赖,特别是在TypeScript开发Angular工程时,经常会遇到类似下面的代码:

import { Component, ElementRef } from '@angular/core';

@Component({
  selector: 'hello-world',
  templateUrl: 'hello-world.html'
})
class HelloWorld {
  constructor(private elementRef: ElementRef) {
    // 在类中就可以使用this.elementRef了
  }
}

constructor中注入的依赖,就可以作为类的属性被使用了。

ngOnInit适用场景

ngOnInit纯粹是通知开发者组件/指令已经被初始化完成了,此时组件/指令上的属性绑定操作以及输入操作已经完成,也就是说在ngOnInit函数中我们已经能够操作组件/指令中被传入的数据了:

// hello-world.ts
import { Component, Input, OnInit } from '@angular/core';

@Component({
  selector: 'hello-world',
  template: `<p>Hello {{name}}!</p>`
})
class HelloWorld implements OnInit {
  @Input()
  name: string;

  constructor() {
    // constructor中还不能获取到组件/指令中被传入的数据
    console.log(this.name);   // undefined
  }

  ngOnInit() {
    // ngOnInit中已经能够获取到组件/指令中被传入的数据
    console.log(this.name);   // 传入的数据
  }
}

所以我们可以在ngOnInit中做一些初始化操作。

总结

开发中我们经常在ngOnInit做一些初始化的工作,而这些工作尽量要避免在constructor中进行,constructor中应该只进行依赖注入而不是进行真正的业务操作。

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

Javascript 相关文章推荐
jQuery TextBox自动完成条
Jul 22 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
Dec 12 Javascript
js操作textarea 常用方法总结
Dec 03 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
JS 弹出层 定位至屏幕居中示例
May 21 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
Jul 15 Javascript
JS实现的自定义网页拖动类
Nov 06 Javascript
Flow之一个新的Javascript静态类型检查器
Dec 21 Javascript
Bootstrap布局方式详解
May 27 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
简单了解vue中的v-if和v-show的区别
Oct 08 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
Nov 13 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
Jun 22 #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
You might like
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
js模拟类继承小例子
2010/07/17 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
javascript实用方法总结
2015/02/06 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
python实现爬虫下载漫画示例
2014/02/16 Python
Python实现股市信息下载的方法
2015/06/15 Python
深入解析Python编程中JSON模块的使用
2015/10/15 Python
老生常谈python之鸭子类和多态
2017/06/13 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
幼儿园元旦亲子活动方案
2014/02/17 职场文书
学生个人自我鉴定
2014/03/26 职场文书
小学生竞选班干部演讲稿
2014/04/24 职场文书
大学生个人求职信例文
2014/07/07 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
高中信息技术教学反思
2016/02/16 职场文书