详解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 相关文章推荐
js自带函数备忘 数组
Dec 29 Javascript
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
Feb 09 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
Sep 04 Javascript
jQuery实现带动画效果的二级下拉导航方法
Mar 11 Javascript
JS实现的自动打字效果示例
Mar 10 Javascript
JavaScript实现自动跳转文本功能
May 25 Javascript
基于AngularJS的简单使用详解
Sep 10 Javascript
Node.js学习之地址解析模块URL的使用详解
Sep 28 Javascript
小程序实现单选多选功能
Nov 04 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
JS解惑之Object中的key是有序的么
May 06 Javascript
浅析vue中的nextTick
Dec 28 Vue.js
详解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 导出Excel示例分享
2014/08/18 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
fckeditor 获取文本框值的实现代码
2009/02/09 Javascript
Javascript 继承机制实例
2009/08/12 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
python抓取京东商城手机列表url实例代码
2013/12/18 Python
Scrapy的简单使用教程
2017/10/24 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
python K近邻算法的kd树实现
2018/09/06 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
关于Numpy数据类型对象(dtype)使用详解
2019/11/27 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
波兰在线运动商店:YesSport
2020/07/23 全球购物
判断单链表中是否存在环
2012/07/16 面试题
营销专业应届生求职信
2013/11/26 职场文书
中学生差生评语
2014/01/30 职场文书
校园安全标语
2014/06/07 职场文书
党员检讨书
2014/10/13 职场文书
小学感恩节活动总结
2015/03/24 职场文书
一行代码python实现文件共享服务器
2021/04/22 Python
Vue实现下拉加载更多
2021/05/09 Vue.js
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python